如何删除Azure BLOB存储中的所有文件

4
背景: 我有一个系统,它与数据库一起工作,其中我保留文件的元数据,并在Azure Blob存储中保存文件。数据库和Azure Blob Storage通过Web服务一起工作。
为了检查系统的所有部分是否正常工作,我创建了单元测试用于Web服务,以下载、上传和删除文件。经过测试,数据库和Azure Blob存储保留了大量数据,我需要全部删除。我有一个脚本可以从数据库中删除所有数据(在一个SQL语句中删除所有表、存储过程、触发器、约束和所有依赖项)。
现在我需要编写一个脚本(power shell)或代码(C#)来删除Azure Blob存储中的所有文件,但我不删除容器,只删除容器中的文件。
我的问题: 哪种方式( power shell 或 С#)是最好的? 如果我使用 C# 和任务(System.Threading.Tasks)来删除文件,会更快吗?

你不想删除容器的原因是什么?依我看来,删除容器然后稍后重新创建它会更快更省钱。 - Gaurav Mantri
当我删除容器并尝试在几秒钟内重新创建它们时,通常会出现异常,指出容器已存在,因此我决定仅删除文件。 - Bushuev
1
没有所谓的“最佳”方式。但是我们对你的测试程度了解很少(10个blob?100个?百万级别的?)。正如@GauravMantri所提问的那样:为什么不删除容器呢?容器很容易在以后重新创建(通过删除,可以保证在创建新容器时从干净的测试设置开始)。 - David Makogon
2
我同意,重新创建一个与已删除容器同名的容器需要一些时间,因为删除操作不是同步的。然而,没有这样的功能可以清除容器(即在单个调用中删除所有文件)。您需要列出容器中的所有文件并逐个删除它们。这是耗时、昂贵且容易出错的,因为您需要进行多次网络调用来列出和删除文件。 - Gaurav Mantri
将来我打算扩展这个方法。想象一下,当用户删除一些文件时,它们是通过任务删除的,因为容器可以被其他用户使用。 - Bushuev
3个回答

6

我不太确定,但是我来这里只是想看看如何一次性删除blob容器中的所有文件。从Azure门户UI上看,他们没有提供任何选择全部删除的功能。

只需要使用Azure存储资源管理器,它具有选择全部删除功能。对我很有效。

我知道这可能与此问题无关,但像我这样想要手动删除的人会发现这很有帮助。


1
它一次给你1000个文件的列表。如果你有比这更多的文件,你需要使用代码方法。 - João Pedro 'jota' Martins
是的,这种方法只能用于测试目的,而且还需要手动操作。 - Indrajeet Gour
足够满足我的需求(即测试)。谢谢! - randolfarevalo

2

如果你想解决这个问题,可以尝试保存容器标题并将其删除,然后在几秒钟内重新创建它们(如果出现错误,则需要等待并重试)。但是,如果你只需要删除文件,可以使用以下方法:

CloudStorageAccount storageAccount;
CloudBlobClient cloudBlobClient;

//connection is kept in app.config
storageAccount =
    CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));
cloudBlobClient = storageAccount.CreateCloudBlobClient();

Parallel.ForEach(cloudBlobClient.ListContainers(), x =>
    {
        Parallel.ForEach(x.ListBlobs(),y=>
            {
                ((CloudBlockBlob)y).DeleteIfExists();
            });
    });

0

基于 Bushuev 的回答。

2022 年更新

这是我完整的类,用于删除所有容器中的所有 blob(除了类顶部列表中的容器)。

唯一需要的参数是“连接字符串”。

public class BlobStorageService : IBlobStorageService
{
    private readonly List<string> _systemContainerNames = new List<string>()
    {
        "azure-webjobs-hosts"
    };

    public async Task CleanAllBlobsInAllContainers(string connectionString)
    {
        CloudBlobClient cloudBlobClient = CloudStorageAccount.Parse(connectionString)
                                                            .CreateCloudBlobClient();

        ContainerResultSegment allContainers = await cloudBlobClient.ListContainersSegmentedAsync(default);

        foreach (CloudBlobContainer container in allContainers.Results)
        {
            if (_systemContainerNames.Any(name => name.Equals(container.Name)))
                continue;

            BlobResultSegment allBlobs = await container.ListBlobsSegmentedAsync(default);

            foreach (CloudBlockBlob blob in allBlobs.Results.OfType<CloudBlockBlob>())
            {
                await blob.DeleteIfExistsAsync();
            }
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接