【发布时间】:2020-03-27 01:49:42
【问题描述】:
我正在尝试在满足条件时为用户重命名容器名称。我做了一些研究,发现 azure blob 存储中的容器没有重命名功能。但是有一种方法可以通过复制文件并在复制后将其删除来完成此操作。下面是我制作的代码。
string ContainerName = "old-container-name-user1";
string NewContainerName = "new-container-name-user2"
CloudStorageAccount sourceAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));
CloudBlobClient sourceblobClient = sourceAccount.CreateCloudBlobClient();
CloudBlobContainer sourceBlobContainer = sourceblobClient.GetContainerReference(ContainerName);
CloudBlobContainer destBlobContainer = sourceblobClient.GetContainerReference(NewContainerName);
CloudBlockBlob blobOriginal = sourceBlobContainer.GetBlockBlobReference(ContainerName);
CloudBlockBlob blobNew = destBlobContainer.GetBlockBlobReference(NewContainerName);
blobNew.StartCopy(blobOriginal);
blobOriginal.Delete();
当我执行此代码时,我收到一条错误消息。以下是错误。
用户未处理的异常 Microsoft.WindowsAzure.Storage.StorageException:'远程服务器 返回错误:(404)未找到。'
Inner Exception WebException:远程服务器返回错误: (404) 未找到。
当我也尝试“blobNew.StartCopyAsync(blobOriginal)”时,代码刚刚通过,但是当我在 azure 中检查容器时,没有创建容器。你认为问题是什么?关于如何改进我的代码的任何提示?删除功能也不起作用。
更新 我更新了我的代码,并且能够将文件从其他容器复制到新容器。下面是代码。
string ContainerName = "old-container-name-user1"
string NewContainerName = "new-container-name-user2"
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference(ContainerName);
CloudBlobContainer destcontainer = blobClient.GetContainerReference(NewContainerName);
destcontainer.CreateIfNotExists(BlobContainerPublicAccessType.Blob);
IEnumerable<IListBlobItem> IE = container.ListBlobs(useFlatBlobListing: true);
foreach (IListBlobItem item in IE)
{
CloudBlockBlob blob = (CloudBlockBlob)item;
CloudBlockBlob destBlob = destcontainer.GetBlockBlobReference(blob.Name);
destBlob.StartCopyAsync(new Uri(GetSharedAccessUri(blob.Name, container)));
}
AccessURI 方法
private static string GetSharedAccessUri(string blobName, CloudBlobContainer container)
{
DateTime toDateTime = DateTime.Now.AddMinutes(60);
SharedAccessBlobPolicy policy = new SharedAccessBlobPolicy
{
Permissions = SharedAccessBlobPermissions.Read,
SharedAccessStartTime = null,
SharedAccessExpiryTime = new DateTimeOffset(toDateTime)
};
CloudBlockBlob blob = container.GetBlockBlobReference(blobName);
string sas = blob.GetSharedAccessSignature(policy);
return blob.Uri.AbsoluteUri + sas;
}
现在它可以工作了,但出现了另一个问题。它说
System.InvalidCastException: '无法转换类型的对象 'Microsoft.WindowsAzure.Storage.Blob.CloudBlobDirectory' 键入 'Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob'。
但这将在另一个问题中发布。感谢我们的朋友 Gauriv 指出我的问题。在下面查看他的答案。
更新 2
通过在IEnumerable<IListBlobItem> IE = container.ListBlobs(blobListingDetails: BlobListingDetails.Metadata); 中添加useFlatBlobListing: true,我能够解决我的问题。这行代码放在我的显示器上。
最终代码
IEnumerable<IListBlobItem> IE = container.ListBlobs(blobListingDetails: BlobListingDetails.Metadata, useFlatBlobListing: true);
【问题讨论】:
-
StartCopy方法会将 blob 从源容器复制到目标容器。您将容器的名称指定为 blob 名称,这就是您收到错误的原因。
标签: c# asp.net azure blob azure-blob-storage