如何从 blob 位于子目录样式的容器中下载所有 blob

how to download all blob from a container where blob sits in sub directory style

我有 blob 文件,它们以子目录形式位于容器下,

通过 C# 后台作业,我需要每小时下载该 Hour 文件夹的所有 blob 文件。

在下面的代码中,我可以使用硬代码路径 (Year/Month/Date/Hour/blob-name) 下载 one 文件,但是如何下载当前 date/time 小时的所有 blob 文件?

 var blobServiceClient = new BlobServiceClient("conn-str");
        BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient("log-test");

        BlobClient blobClient = containerClient.GetBlobClient("2021/08/11/01/log.txt");

        await blobClient.DownloadToAsync(@"C:\Temp\Result.txt");

注:- 我试过了,但这是性能问题吗?我不能直接转到实际的 HOUR 文件夹吗?

var blobItems = containerClient.GetBlobs().Where(blobItem => blobItem.Properties.LastModified != null 
                                                             && blobItem.Properties.LastModified.Value.Year == DateTime.UtcNow.Year 
                                                             && blobItem.Properties.LastModified.Value.Month == DateTime.UtcNow.Month 
                                                             && blobItem.Properties.LastModified.Value.Day == DateTime.UtcNow.Day 
                                                             && blobItem.Properties.LastModified.Value.Hour == DateTime.UtcNow.Hour)
            .ToList();

        foreach (var blob in blobItems)
        {
            BlobClient blobClient = containerClient.GetBlobClient(blob.Name);

            await blobClient.DownloadToAsync($"C:\Temp\{blob.Name.Replace('/','-')}");
        }

你的这个代码

var blobItems = containerClient.GetBlobs().Where(blobItem => blobItem.Properties.LastModified != null 
                                                             && blobItem.Properties.LastModified.Value.Year == DateTime.UtcNow.Year 
                                                             && blobItem.Properties.LastModified.Value.Month == DateTime.UtcNow.Month 
                                                             && blobItem.Properties.LastModified.Value.Day == DateTime.UtcNow.Day 
                                                             && blobItem.Properties.LastModified.Value.Hour == DateTime.UtcNow.Hour)
            .ToList();

未优化,因为它列出了容器中的所有 blob,然后在客户端进行过滤。

您要使用的方法是 BlobContainerClient.GetBlobsByHierarchy 并指定 Year/Month/Date/Hour/ 作为 prefix 参数的值。然后你只会得到那个小时的斑点。获得该列表后,您就可以单独下载 blob。