【问题标题】:how to download all blob from a container where blob sits in sub directory style如何从 blob 位于子目录样式的容器中下载所有 blob
【发布时间】:2021-12-01 16:53:29
【问题描述】:

我有位于容器下的子目录样式的 blob 文件,

  • 容器名称 = 日志测试
  • 年份文件夹
  • 月文件夹
  • 日期文件夹
  • 小时文件夹

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

在下面的代码中,我可以下载带有硬代码路径(年/月/日/小时/blob 名称)的one 文件,但是如何下载当前日期/时间小时的所有 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('/','-')}");
        }

【问题讨论】:

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

标签: c# azure-blob-storage


【解决方案1】:

你的这段代码

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。获得该列表后,您就可以单独下载 Blob。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 2021-07-02
    • 2016-09-01
    • 2018-04-13
    • 2020-04-11
    • 2017-07-19
    相关资源
    最近更新 更多