在复制和删除容器时更改Blob和容器的Metadata [“ Filename”]

时间:2019-12-03 08:28:11

标签: c# asp.net azure azure-storage-blobs

我正在尝试在满足特定条件时更改容器名称和其中的特定文件。下面的第一个代码可以正常工作。它可以正确更改容器名称和blob.name。问题是下面的第二个代码。

下面是我的代码。

string ContainerName = "old-container-name";
        string NewContainerName = "new-container-name";
        var storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));
        var blobClient = storageAccount.CreateCloudBlobClient();
        var sourcecontainer = blobClient.GetContainerReference(ContainerName);
        var destcontainer = blobClient.GetContainerReference(NewContainerName);
        destcontainer.CreateIfNotExists(BlobContainerPublicAccessType.Blob);
        BlobContinuationToken continuationToken = null;
        do
        {
            var blobsResult = sourcecontainer.ListBlobsSegmented(prefix: "", useFlatBlobListing: true, blobListingDetails: BlobListingDetails.All, maxResults: 1000, currentToken: continuationToken, options: new BlobRequestOptions(), operationContext: new OperationContext());
            continuationToken = blobsResult.ContinuationToken;
            var items = blobsResult.Results;
            foreach (var item in items)
            {
                string newName = "";
                var blob = (CloudBlob)item;
                if (blob.Name.Contains("originalfilename"))
                    newName = blob.Name.Replace("originalfilename", "newfilename");
                else
                    newName = blob.Name;

                var targetBlob = destcontainer.GetBlobReference(newName);
                targetBlob.StartCopy(blob.Uri);
            }
        }
        while (continuationToken != null);
        sourcecontainer.DeleteIfExists(); 

在我在上面的代码中添加此条件之前。

        if (blob.Metadata["Filename"].Contains("originalfilename"))
        {
            blob.Metadata["Filename"] = blob.Metadata["Filename"].Replace("originalfilename", "newfilename");
            targetBlob.SetMetadata();
        }

我能够更改文件的元数据[“文件名”],但是在检索文件之前遇到了错误,而以前没有发生。我认为我更新元数据的方式是错误的。

下面是错误消息:

  

异常详细信息:System.Collections.Generic.KeyNotFoundException:   字典中不存在给定的键。

关于如何解决这一问题或更改元数据的更好方法的任何技巧?

1 个答案:

答案 0 :(得分:0)

根据我的测试,Filename不是blob的内置元数据。内置的是Name,您无法更改。它始终等于Blob的名称。

因此,正如@Gaurav Mantri在评论中所说,您是否为每个Blob手动添加了Filename元数据?

如果您为Blob添加了Filename元数据,则可以按照以下方式获取和更新它:

    public static void Test()
    {
        string connString = "your_connection_string";
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connString);
        CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();

        CloudBlobContainer cloudBlobContainer = cloudBlobClient.GetContainerReference("pub");
        CloudBlockBlob cloudBlockBlob = cloudBlobContainer.GetBlockBlobReference("CP4.png");

        // Important, you need to fetch all attributes first! 
        cloudBlockBlob.FetchAttributes();

        if (cloudBlockBlob.Metadata.ContainsKey("Filename"))
        {

            Console.WriteLine(cloudBlockBlob.Metadata["Filename"].ToString());
            cloudBlockBlob.Metadata["Filename"] = "123";
            cloudBlockBlob.SetMetadata();
        }
        else
        {
            cloudBlockBlob.Metadata.Add("Filename", "CP4.png");
            cloudBlockBlob.SetMetadata();
        }
    }

在我的测试中,CP4.png blob的Filename元数据已更新为123

enter image description here