Has*_*aig 22 azure azure-storage azure-storage-blobs
我在Azure中有一个blob容器,pictures其中包含各种文件夹(请参阅下面的快照):
我正在尝试删除快照中标题users和uploads显示的文件夹,但我保留错误:Failed to delete blob pictures/uploads/. Error: The specified blob does not exist.有人能说明我如何删除这两个文件夹吗?通过谷歌搜索这个问题,我无法发现任何有意义的东西.
注意:如果您需要,请向我询问更多信息
小智 31
Windows Azure Blob存储没有文件夹的概念.层次结构非常简单:存储帐户>容器> blob.实际上,删除特定文件夹会删除所有以文件夹名称开头的blob.您可以编写如下的简单代码来删除文件夹:
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("your storage account");
CloudBlobContainer container = storageAccount.CreateCloudBlobClient().GetContainerReference("pictures");
foreach (IListBlobItem blob in container.GetDirectoryReference("users").ListBlobs(true))
{
if (blob.GetType() == typeof(CloudBlob) || blob.GetType().BaseType == typeof(CloudBlob))
{
((CloudBlob)blob).DeleteIfExists();
}
}
Run Code Online (Sandbox Code Playgroud)
container.GetDirectoryReference("用户").ListBlobs(真)列出了斑点"图片报"容器内开始与"用户",然后你可以逐个删除它们.要删除其他文件夹,您只需要指定此GetDirectoryReference("您的文件夹名称").
Mel*_*lih 12
在最新的存储库 Azure.Storage.Blobs 中,它非常简单
var connectionString = "blob-connection-string";
var containerName = "container-name";
var folderPath = "folder1/subfolder/sub-subfolder";
var blobServiceClient = new BlobServiceClient(connectionString);
var blobContainerClient = blobServiceClient.GetBlobContainerClient(containerName);
var blobItems = blobContainerClient.GetBlobsAsync(prefix: folderPath);
await foreach (BlobItem blobItem in blobItems)
{
BlobClient blobClient = blobContainerClient.GetBlobClient(blobItem.Name);
await blobClient.DeleteIfExistsAsync();
}
Run Code Online (Sandbox Code Playgroud)
由于每个 blob 都有自己的 uri 值,因此您可以在查询之前设置前缀,以便它可以获取和删除具有特定 uri 的 blob。该文件夹将随着 blob 被删除而消失。
stu*_*net 10
还有一个来自Microsoft的桌面存储资源管理器。它具有一项功能,您可以选择虚拟文件夹,然后将其删除,从而有效删除所有子斑点。
https://azure.microsoft.com/zh-cn/features/storage-explorer/
因为"文件夹"实际上并不存在.在Azure存储帐户中,您有容器,其中包含blob.客户端将其视为"文件夹"的内容是帐户"pictures/uploads /"中blob的文件名.如果要删除"文件夹",实际上必须删除使用相同"路径"命名的每个blob.
最常见的方法是获取这些blob的列表,然后将其提供给delete blob调用.
让我们从一个示例开始,该示例如何使用ListBlobsSegmentedAsyc删除“文件夹”:
var container = // get container reference
var ctoken = new BlobContinuationToken();
do
{
var result = await container.ListBlobsSegmentedAsync("myfolder", true, BlobListingDetails.None, null, ctoken, null, null);
ctoken = result.ContinuationToken;
await Task.WhenAll(result.Results
.Select(item => (item as CloudBlob)?.DeleteIfExistsAsync())
.Where(task => task != null)
);
} while (ctoken != null);
Run Code Online (Sandbox Code Playgroud)
它能做什么...
var ctoken = new BlobContinuationToken();
Run Code Online (Sandbox Code Playgroud)
一个“文件夹”可能包含很多文件。ListBlobSegmentedAsyc可能仅返回其中的一部分。该令牌将存储信息,以便在下一个呼叫中继续。
var result = await container.ListBlobsSegmentedAsync("myfolder", true, BlobListingDetails.None, null, ctoken, null, null);
Run Code Online (Sandbox Code Playgroud)
有关所有参数,请参阅https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.windowsazure.storage.blob.cloudblobclient.listblobssegmentedasync?view=azure-dotnet了解详细信息。
(item as CloudBlob)?.DeleteIfExistsAsync()
Run Code Online (Sandbox Code Playgroud)
现在,在result.Results中有一个IListBlobItem列表。因为不能保证IListBlobItem是可删除的CloudBlob(例如,如果我们将useFlatBlobListing = false设置为false,则它可以是虚拟文件夹),因此我们尝试对其进行投射并在可能的情况下将其删除。
result.Results.Select(item => (item as CloudBlob)?.DeleteIfExistsAsync())
Run Code Online (Sandbox Code Playgroud)
触发所有结果的删除并返回任务列表。
.Where(task => task != null)
Run Code Online (Sandbox Code Playgroud)
如果“结果”包含我们无法转换为CloudBlob的项目,则我们的任务列表包含空值。我们必须删除它们。
...然后,我们等待直到当前段的所有删除操作完成,然后继续下一个段(如果有)。
WindowsAzure.Storage包在版本 9.4.0 中被拆分为单独的包。这意味着接受的答案中使用的 API在最新的Azure.Storage.Blobs包中已更改。
下面的方法使用较新的Azure.Storage.Blobs包中的 API ,但仍然使用与接受的答案相同的方法,即列出所有 Blob,然后一次删除它们。
string ConnectionString = "<your connection string>";
string ContainerName = "<your container name>";
private BlobContainerClient ContainerClient()
{
var client = new BlobContainerClient(ConnectionString, ContainerName);
client.CreateIfNotExists();
return client;
}
public async Task<List<BlobItem>> ListBlobsAsync(string folder)
{
var c = ContainerClient();
var enumerator = c.GetBlobsByHierarchyAsync(prefix: folder).GetAsyncEnumerator();
var result = new List<BlobItem>();
while (await enumerator.MoveNextAsync())
{
if (enumerator.Current.IsBlob)
result.Add(enumerator.Current.Blob);
}
return result;
}
public async Task DeleteByFolderAsync(string folder)
{
var c = ContainerClient();
foreach (var blob in await ListBlobsAsync(folder))
{
await c.GetBlobClient(blob.Name).DeleteIfExistsAsync(DeleteSnapshotsOption.IncludeSnapshots);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16351 次 |
| 最近记录: |