复制Azure Blob及其元数据

时间:2015-03-05 09:33:52

标签: c# azure metadata blob

所以我想将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。这可能吗?

2 个答案:

答案 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。