C# 复制Azure Blob及其元数据
因此,我想将Azure blob及其元数据复制到新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
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这是个好问题。。。老实说,我不知道。我需要看看这个