如何设置ObjectWriteStream的起始索引?

我正在尝试建立与Google存储桶中文件的连接,但是我很难实现ReturnFocusTimer。问题是,如果我为已经在云中的文件创建一个ObjectWriteStream,它将删除旧文件并从其开头开始。这是示例代码

ObjectWriteStream

我该怎么做才能防止namespace gcs = google::cloud::storage; void test(gcs::Client client,string bucket_name,string file_name){ auto writeCon = client.WriteObject(bucket_name.c_str(),file_name.c_str()); writeCon << "This is a test"; writeCon.Close(); } 删除文件并从我想要的位置上传数据(例如,将数据追加到文件中)?我试图调用标准的ostream函数ObjectWriteStream来设置流的位置。由于seekp不支持,因此无法使用。奇怪的是,ObjectWriteStream既不支持此操作,但具有选项ObjectReadStream来设置起始位置。因此,我想知道是否存在一种非标准的方法来设置gcs::ReadRange(start,end)的位置。如果有人可以建议我,我将不胜感激。

bmw3i8is 回答:如何设置ObjectWriteStream的起始索引?

  

它将删除旧文件并从其开头开始。

这是设计使然。请记住, GCS不是文件系统。 GCS是对象存储。在对象存储中,对象是原子单位。您无法修改对象。

如果需要文件系统语义,则可能要使用Cloud Filestore

,

表明对象是不可变的答案是正确的。但是,可以使用compose API将两个或更多对象 连接在一起。这是relevant javadoc

因此您可以结合一些技术来有效地将其附加到GCS中的对象上。

  • 您可以将现有对象(A)复制到相同位置和存储类中的新对象(B)(这将非常快),删除A,将新数据上传到对象C中,然后编写B + C进入A的原始位置。然后删除B和C。这将需要复制,删除,上载,撰写,然后进行两次删除-因此需要进行六个操作。请注意operations costs

  • 您可以简单地上载一个新对象(B),然后将A + B组合到一个新对象C中,并将新对象的名称记录在元数据数据库中(如果使用的话)。这将仅需要一个上载,撰写和两个删除。

,

在Google Cloud Storage中,对象是不可变的。参见:

https://cloud.google.com/storage/docs/key-terms#immutability

这意味着您只是不能附加到文件。您可以重写传递原始内容的文件,然后添加更多内容。

本文链接:https://www.f2er.com/3149474.html

大家都在问