如何从 blob 位于子目录样式的容器中下载所有 blob
how to download all blob from a container where blob sits in sub directory style
我有 blob 文件,它们以子目录形式位于容器下,
- 容器名称=log-test
- 年份文件夹
- 月份文件夹
- 日期文件夹
- 小时文件夹
通过 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。
我有 blob 文件,它们以子目录形式位于容器下,
- 容器名称=log-test
- 年份文件夹
- 月份文件夹
- 日期文件夹
- 小时文件夹
通过 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。