如何从Azure存储容器中获取指定文件夹下的Blob并排除子文件夹内容
解决Azure Blob存储中仅获取指定文件夹下直接Blob的问题
刚好我之前处理过一模一样的需求,Azure Blob存储的“文件夹”其实是基于Blob名称的虚拟结构(并没有真正的文件夹实体),所以要精准过滤出指定文件夹下的直接Blob、排除子文件夹内容,关键是正确组合ListBlobs方法的参数:
核心思路
当你设置prefix时,必须配合delimiter参数来区分“虚拟文件夹”和直接Blob,同时通过类型筛选排除文件夹项。
具体实现代码(C#示例)
// 假设你已经初始化好CloudBlobContainer实例 CloudBlobContainer container = GetYourCloudBlobContainer(); // 调用ListBlobs时,注意prefix要以斜杠结尾,同时指定delimiter为"/" var blobResults = container.ListBlobs( prefix: "Folder/", // 斜杠结尾确保只匹配Folder下的内容,避免误匹配类似FolderXYZ的前缀 useFlatBlobListing: false, // 不使用扁平列表,保留层级结构 delimiter: "/" // 用斜杠作为分隔符,区分虚拟文件夹和Blob ); // 筛选出直接在Folder下的Blob(排除CloudBlobDirectory类型的子文件夹) var targetBlobs = blobResults.OfType<CloudBlockBlob>().ToList();
参数解释
- prefix: "Folder/":一定要加上结尾的斜杠,否则会匹配所有以
Folder开头的Blob(比如FolderSub/image.jpg这种不属于目标文件夹的内容),加斜杠后只会匹配Folder/开头的项,也就是目标文件夹下的内容。 - delimiter: "/":这个参数会让Azure存储返回两类结果:一是直接在
Folder/下的Blob,二是Folder/下的虚拟文件夹(比如Folder/Sub-Folder/),这些虚拟文件夹会以CloudBlobDirectory类型返回。 - useFlatBlobListing: false:保持默认的层级列表模式,这样才能区分出文件夹和直接Blob。如果设为true,会把所有子文件夹的Blob都扁平返回,不符合你的需求。
验证结果
运行这段代码后,targetBlobs里就只会包含Folder/image1.jpg,而Folder/Sub-Folder/image2.jpg会被排除在外,因为它属于子文件夹Sub-Folder下的内容,不会被包含在直接Blob的结果里。
内容的提问来源于stack exchange,提问作者Cedric
相关产品推荐
相关产品推荐

