C# 复制Azure Blob及其元数据

C# 复制Azure Blob及其元数据,c#,azure,metadata,blob,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); c

因此,我想将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。这可能吗?

所以我必须自己实现这一点。我认为通过
CopyFromBlob
方法上的一个选项可以更容易地做到这一点,但显然不是这样。 因此,在blob完成复制添加后:

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.FetchAttributes();
foreach(blob.Metadata中的var属性)
{
if(newBlob.Metadata.ContainsKey(attribute.Key))
{
newBlob.Metadata[attribute.Key]=attribute.Value;
}
其他的
{
添加(新的KeyValuePair(attribute.Key,attribute.Value));
}
}
newBlob.SetMetadata();

这将跨所有元数据从旧blob复制到新blob。

查看REST API文档有一件事引起了我的注意(在
请求标题下,
x-ms-meta-name:value
):

如果未指定名称-值对,则操作将复制 将源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"));
} 
newBlob.FetchAttributes();
if(newBlob.Metadata.ContainsKey(StorageManager.IsLive))
{
newBlob.Metadata[StorageManager.IsLive]=“N”;
}
其他的
{
添加(新的KeyValuePair(StorageManager.IsLive,“N”);
} 
由于新blob的元数据已存在,因此复制blob操作不会将元数据从源blob复制到目标


如果删除上面的代码,源blob中的元数据应该复制到新blob。

我认为没有必要。复制blob操作将源blob的元数据复制到目标blob(请参阅
x-ms-meta-name:value
中的
Request Headers
部分:)。您能分享一下如何创建newBlob实例的代码吗?另外,我尝试复制一个blob,它将元数据从源正确复制到目标。@gauravMantri我保存了实际代码,但没有使用新的元数据
foreach
仅等于1(IsLive属性),因此未复制任何现有元数据。API中可能有Bug?还是不正确的用法?@gauravMantri我注意到了我自己的错误。。。。我没有执行newBlob.SetMetadata();设置
IsLive
元数据属性后。可能是API中的一个小错误,可能更多是由于不正确的使用。我的方法是一个简洁的解决方案,虽然它必须说是一个快速的问题。。。为什么你要保存新的斑点,然后在上面复制旧斑点?@GauravMantri这是个好问题。。。老实说,我不知道。我需要看看这个