gpt4 book ai didi

c# - 遍历特定的Azure Blob存储目录并删除所有文件

转载 作者:行者123 更新时间:2023-12-03 05:38:24 25 4
gpt4 key购买 nike

目标:删除特定目录中的所有文件,包括嵌套文件夹中的文件。

问题:删除目录本身不起作用,因为这会返回错误:

Exception: The specified blob does not exist

我的 Azure blob 存储结构可能如下所示:

AzureFileStorageAccount
AzureContainerName
/themes
/irrelevantstuff
/images
/a
1.jpg
/b
/thumb
1thumb.png
/c
4.jpg
6.jpg
9.jpg
10.jpg

我不知道任何文件夹名称是什么,但对于最终结果,我想获取给定目录中找到的所有实际文件的堆栈/列表。

例如,以images目录为例:

/images/a/1.jpg
/images/b/thumb/1thumb.png
/images/c/4.jpg
/images/6.jpg
/images/9.jpg
/images/10.jpg

然后,将其全部删除。

<小时/>

这是我尝试的解决方案..

LoadInitialDirectory函数:

public static void LoadInitialDirectory() {
string initialDirectory = "images";

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(azureFileStorageAccount);
CloudBlobClient client = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = client.GetContainerReference(azureContainerName);
CloudBlobDirectory directory = container.GetDirectoryReference(initialDirectory);

var blobs = await directory.ListBlobSegmentedAsync(false, BlobListingDetails.Metadata, 350, null, null, null);
foreach(var blob in blobs.Results)
{
var b = new CloudBlob(blob.Uri);
CloudBlockBlob blockBlob = container.GetBlockBlobReference(b.Name);
if (blockBlob.Exists()) {
// I will assume this is a file
ProcessFile(blockBlob.Uri);
}
else {
// This is another directory
ProcessDirectory(blockBlob.Uri);
}
}
}

ProcessDirectory函数:

public static void ProcessDirectory(string innerDirectory) {
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(azureFileStorageAccount);
CloudBlobClient client = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = client.GetContainerReference(azureContainerName);
CloudBlobDirectory directory = container.GetDirectoryReference(innerDirectory);

var blobs = await directory.ListBlobSegmentedAsync(false, BlobListingDetails.Metadata, 350, null, null, null);
foreach(var blob in blobs.Results)
{
var b = new CloudBlob(blob.Uri);
CloudBlockBlob blockBlob = container.GetBlockBlobReference(b.Name);
if (blockBlob.Exists()) {
ProcessFile(blockBlob.Uri);
}
else {
ProcessDirectory(blockBlob.Uri);
}
}
}

ProcessFile函数:

public static void ProcessFile(string innerDirectory) {
myStack.push(innerDirectory);
}

最后,我应该有一堆 blob Uri 字符串,我可以通过 DeleteAsync 方法迭代并删除它,从而删除初始目录。

这似乎有些过分了。有谁有更紧凑、更简单的解决方案的想法吗?

最佳答案

有一点需要注意:在 blob 存储中,目录(和子目录)实际上被视为 blob 名称的一部分。如果删除某个目录中的所有 blob,该目录将被自动删除。

删除目录(及其子目录)内所有blob的方法是列出所有blob,然后将blob一一删除。

假设您正在使用此 blob 存储包 Microsoft.Azure.Storage.Blob, version 11.1.3 ,然后您可以使用 blobDirectory.ListBlobs() 方法并将参数 useFlatBlobListing 设置为 true ,这样您就可以迭代指定目录(以及子目录)。

示例代码如下,对我有用:

        var conn_str = "DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=xxxxxx;EndpointSuffix=core.windows.net";
var myContainer = "aaa";
var myDirectory = "images";

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(conn_str);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer blobContainer = blobClient.GetContainerReference(myContainer);
CloudBlobDirectory blobDirectory = blobContainer.GetDirectoryReference(myDirectory);

//set useFlatBlobListing as true, so you can list all the blobs in the directory(and it's sub-directories)
var blobs = blobDirectory.ListBlobs(useFlatBlobListing: true);

//iterate through all the blobs in the specified directory(and it's sub-directories)
foreach (var myblob in blobs)
{
var b = (CloudBlockBlob)myblob;

//print out some properties of the blob, just for testing purpose.
Console.WriteLine(b.Name);
Console.WriteLine(b.Uri);
Console.WriteLine("***********");

//delete the blob
b.Delete();
}

关于c# - 遍历特定的Azure Blob存储目录并删除所有文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60570808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com