复制时是否可以强制在新 blob 上覆盖 azure blob 元数据
Is it possible to force azure blob metadata to be overwritten on new blob when copying
所以我正在复制一个 blob blob
并使用以下代码覆盖另一个 blob newBlob
:
CopyStatus copy = CopyStatus.Pending;
while (copy != CopyStatus.Success)
{
newBlob.StartCopyFromBlob(blob);
copy = manager.CheckIsDoneCopying(newBlob, container.Name);
}
newBlob
在复制之前已经有元数据,从 here 我看到:
If no name-value pairs are specified, the operation will copy the
source blob metadata to the destination blob. If one or more
name-value pairs are specified, the destination blob is created with
the specified metadata, and metadata is not copied from the source
blob.
据我所知,旧的 blob 元数据将不会被复制。我想强制原始 blob 覆盖 newBlob's
元数据,然后使用以下内容编辑 newBlobs 元数据:
newBlob.FetchAttributes();
if (newBlob.Metadata.ContainsKey(StorageManager.IsLive))
{
newBlob.Metadata[StorageManager.IsLive] = "Y";
}
else
{
newBlob.Metadata.Add(new KeyValuePair<string, string>(StorageManager.IsLive, "Y"));
}
if (newBlob.Metadata.ContainsKey(StorageManager.LastUploadedTime))
{
newBlob.Metadata[StorageManager.LastUploadedTime] = uploadedTime.Ticks.ToString();
}
else
{
newBlob.Metadata.Add(new KeyValuePair<string, string>(StorageManager.LastUploadedTime, uploadedTime.Ticks.ToString()));
}
是否可以强制覆盖旧 blob 中的新 blob 元数据?
编辑
如果我在我的代码中添加一行:
CopyStatus copy = CopyStatus.Pending;
newBlob.Metadata.Clear();
while (copy != CopyStatus.Success)
{...
元数据已复制过来。尽管这不是复制操作失败或从未完成的唯一方法,但这意味着我有一个无效的 newBlob。一定有比这更好的方法吧?
不,在执行 newBlob.StartCopyFromBlob(blob) 之前调用 newBlob.Metadata.Clear() 并不意味着在服务器端清除 newBlob 的元数据,然后开始异步复制 blob。需要明确的是,除非您随后调用 newBlob.SetMetadata(),否则 newBlob.Metadata.Clear() 不会触发对服务器的真正请求。
实际上,在执行newBlob.StartCopyFromBlob(blob) 之前调用newBlob.Metadata.Clear() 恰好意味着"not specifying any key-value pair in CopyBlob request",这是您在MSDN 网页上看到的。
因此,您的方案很完美,如您所愿,请再次验证! :)
所以我正在复制一个 blob blob
并使用以下代码覆盖另一个 blob newBlob
:
CopyStatus copy = CopyStatus.Pending;
while (copy != CopyStatus.Success)
{
newBlob.StartCopyFromBlob(blob);
copy = manager.CheckIsDoneCopying(newBlob, container.Name);
}
newBlob
在复制之前已经有元数据,从 here 我看到:
If no name-value pairs are specified, the operation will copy the source blob metadata to the destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata is not copied from the source blob.
据我所知,旧的 blob 元数据将不会被复制。我想强制原始 blob 覆盖 newBlob's
元数据,然后使用以下内容编辑 newBlobs 元数据:
newBlob.FetchAttributes();
if (newBlob.Metadata.ContainsKey(StorageManager.IsLive))
{
newBlob.Metadata[StorageManager.IsLive] = "Y";
}
else
{
newBlob.Metadata.Add(new KeyValuePair<string, string>(StorageManager.IsLive, "Y"));
}
if (newBlob.Metadata.ContainsKey(StorageManager.LastUploadedTime))
{
newBlob.Metadata[StorageManager.LastUploadedTime] = uploadedTime.Ticks.ToString();
}
else
{
newBlob.Metadata.Add(new KeyValuePair<string, string>(StorageManager.LastUploadedTime, uploadedTime.Ticks.ToString()));
}
是否可以强制覆盖旧 blob 中的新 blob 元数据?
编辑
如果我在我的代码中添加一行:
CopyStatus copy = CopyStatus.Pending;
newBlob.Metadata.Clear();
while (copy != CopyStatus.Success)
{...
元数据已复制过来。尽管这不是复制操作失败或从未完成的唯一方法,但这意味着我有一个无效的 newBlob。一定有比这更好的方法吧?
不,在执行 newBlob.StartCopyFromBlob(blob) 之前调用 newBlob.Metadata.Clear() 并不意味着在服务器端清除 newBlob 的元数据,然后开始异步复制 blob。需要明确的是,除非您随后调用 newBlob.SetMetadata(),否则 newBlob.Metadata.Clear() 不会触发对服务器的真正请求。
实际上,在执行newBlob.StartCopyFromBlob(blob) 之前调用newBlob.Metadata.Clear() 恰好意味着"not specifying any key-value pair in CopyBlob request",这是您在MSDN 网页上看到的。
因此,您的方案很完美,如您所愿,请再次验证! :)