如何在Azure Blob存储中读取指定子目录内的文件?
只读取Azure Blob存储指定子目录内容的修改方案
核心逻辑
Azure Blob存储的“子目录”是基于Blob名称前缀实现的虚拟结构。要限制只读取2024/Data/下的内容,需通过指定前缀+禁用递归遍历来实现。
修改后的代码
假设你的BlobStorage<T>.GetBlobs()方法支持传入前缀和遍历选项参数,直接调整调用逻辑即可:
var blobStorage = new BlobStorage<Documents>(Environment.GetEnvironmentVariable("AzureStorage"), "documents"); var itemCount = 0; var maxItems = (31 * 100); // 目标子目录前缀,必须以"/"结尾 var targetPrefix = "2024/Data/"; // 传入前缀并关闭递归遍历 await foreach (var data in blobStorage.GetBlobs(prefix: targetPrefix, recursive: false)) { // 你的文件信息获取逻辑 itemCount++; }
自定义BlobStorage类的补充实现(若需)
如果BlobStorage<T>是你自行封装的类,需要确保内部调用Azure官方SDK时正确传递参数。以下是基于BlobContainerClient的参考实现:
public async IAsyncEnumerable<T> GetBlobs(string prefix = null, bool recursive = true) { var containerClient = new BlobContainerClient(_connectionString, _containerName); // 使用GetBlobsByHierarchy实现虚拟目录遍历,delimiter设置为"/"区分目录 var blobHierarchyItems = containerClient.GetBlobsByHierarchy( traits: BlobTraits.None, states: BlobStates.None, prefix: prefix, delimiter: recursive ? null : "/", cancellationToken: CancellationToken.None ); await foreach (var item in blobHierarchyItems) { // 仅处理实际Blob文件,跳过虚拟目录项 if (item.IsBlob) { // 替换为你将BlobItem转换为Documents类型的逻辑 yield return MapToDocuments(item.Blob); } } }
关键注意点
- 前缀必须以
/结尾:比如2024/Data/,避免误匹配名称以2024/Data开头的其他路径(如2024/DataXYZ/) - 关闭递归:通过
recursive: false或delimiter: "/",确保只读取目标目录下的直接文件,不遍历深层子目录
内容的提问来源于stack exchange,提问作者user2432361
相关产品推荐
相关产品推荐

