所以我想将Azure blob及其元数据复制到新的blob中。 我有方法
public void CopyBlob(CloudBlockBlob blob, CloudBlockBlob newBlob)
{
CopyStatus copy = CopyStatus.Pending;
while (copy != CopyStatus.Success)
{
newBlob.StartCopyFromBlob(blob);
copy = CheckIsDoneCopying(newBlob, "MyContainerName");
}
}
public CopyStatus CheckIsDoneCopying(CloudBlockBlob blob, string containerName)
{
while (blob.CopyState.Status == CopyStatus.Pending)
{
Thread.Sleep(TimeSpan.FromSeconds(20));
blob = GetBlob(blob.Name, containerName);
}
return blob.CopyState.Status;
}
这些方法适用于复制blob,但不会将现有元数据从现有blob复制到新blob。这可能吗?
答案 0 :(得分:1)
所以我必须自己实施。我认为通过CopyFromBlob
方法的选项可以更容易地做到这一点,但显然不是。
所以在blob完成后复制add:
blob.FetchAttributes();
foreach (var attribute in blob.Metadata)
{
if (newBlob.Metadata.ContainsKey(attribute.Key))
{
newBlob.Metadata[attribute.Key] = attribute.Value;
}
else
{
newBlob.Metadata.Add(new KeyValuePair<string, string>(attribute.Key, attribute.Value));
}
}
newBlob.SetMetadata();
这将复制从旧blob到新的所有元数据。
答案 1 :(得分:1)
查看Copy Blob
的REST API文档,有一件事引起了我的注意(在Request Headers
部分x-ms-meta-name:value
下):
如果未指定名称 - 值对,则操作将复制 源blob元数据到目标blob。如果一个或多个 指定了名称 - 值对,使用创建目标blob 指定的元数据和元数据不会从源复制 斑点。
现在,当我查看您的源代码时,您实际上是在复制之前在新Blob上设置元数据。
newBlob.FetchAttributes();
if (newBlob.Metadata.ContainsKey(StorageManager.IsLive))
{
newBlob.Metadata[StorageManager.IsLive] = "N";
}
else
{
newBlob.Metadata.Add(new KeyValuePair<string, string>(StorageManager.IsLive, "N"));
}
由于新blob已存在元数据,因此复制blob操作不会将元数据从源blob复制到目标。
如果删除上面的代码,则应将源blob中的元数据复制到新blob。