让我们从一个如何使用 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);
它的作用...
var ctoken = new BlobContinuationToken();
一个“文件夹”可能包含很多文件。 ListBlobSegmentedAsyc 可能只返回其中的一部分。此令牌将存储信息,以便在下次通话中继续。
var result = await container.ListBlobsSegmentedAsync("myfolder", true, BlobListingDetails.None, null, ctoken, null, null);
- 第一个参数是所需的 blob 名称(“路径”)前缀。
- 第二个参数“useFlatBlobListing=true”告诉客户端返回所有子文件夹中的所有项目。如果设置为 false,它将以“虚拟文件夹”模式运行,并像文件系统一样运行。
- ctoken 将告诉 azure 在哪里继续
有关所有参数,请参阅https://docs.microsoft.com/en-us/dotnet/api/microsoft.windowsazure.storage.blob.cloudblobclient.listblobssegmentedasync?view=azure-dotnet 了解详情。
(item as CloudBlob)?.DeleteIfExistsAsync()
现在我们在 result.Results 中有一个 IListBlobItem 列表。因为不能保证 IListBlobItem 是可删除的 CloudBlob(例如,如果我们设置 useFlatBlobListing=false,它可能是一个虚拟文件夹),我们会尝试强制转换它并在可能的情况下将其删除。
result.Results.Select(item => (item as CloudBlob)?.DeleteIfExistsAsync())
触发删除所有结果并返回任务列表。
.Where(task => task != null)
如果结果包含我们无法转换为 CloudBlob 的项目,我们的任务列表包含空值。我们必须删除它们。
...然后我们等待当前段的所有删除完成并继续下一个段(如果可用)。