使用C#获取Azure Data Lake所有文件夹下全部文件的实现示例
使用.NET(C#)获取Azure Data Lake Storage文件列表实现方案
以下针对主流的ADLS Gen2提供实现方案,性能远高于Data Factory Lookup活动,单账户千万级文件场景下也可稳定运行。
前置依赖
需要先安装对应NuGet包:
Azure.Storage.Files.DataLake:Azure官方ADLS Gen2 SDK,原生支持批量路径遍历,接口开销极低- 可选:
Azure.Identity用于AAD托管身份认证,无需硬编码密钥,安全性更高
核心实现代码
using Azure.Storage.Files.DataLake; using Azure.Identity; using System.Text; namespace AdlsFileListFetcher { class Program { static async Task Main(string[] args) { // 可根据实际情况改为配置文件读取 string adlsAccountName = "替换为你的ADLS账户名"; string containerName = "替换为你要遍历的容器名"; string logSavePath = @"./log/file_list_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".log"; // 初始化客户端,优先推荐托管身份认证,适合Azure云环境运行 DataLakeServiceClient adlsClient = new DataLakeServiceClient( new Uri($"https://{adlsAccountName}.dfs.core.windows.net"), new DefaultAzureCredential()); // 如果本地调试用连接字符串,替换上面的初始化逻辑即可 // string adlsConnectionString = "替换为你的ADLS连接字符串"; // DataLakeServiceClient adlsClient = new DataLakeServiceClient(adlsConnectionString); DataLakeFileSystemClient containerClient = adlsClient.GetFileSystemClient(containerName); List<string> allFilePaths = new List<string>(); // 递归拉取所有路径,服务端直接返回全量层级结果,无需手动实现递归 await foreach (var pathItem in containerClient.GetPathsAsync(recursive: true)) { // 只保留文件,过滤文件夹 if (!pathItem.IsDirectory.GetValueOrDefault()) { // 若文件量超过100万,建议边遍历边写入,避免内存占用过高 // File.AppendAllText(logSavePath, pathItem.Name + Environment.NewLine, Encoding.UTF8); allFilePaths.Add(pathItem.Name); } } // 全量收集完成后统一写入日志 Directory.CreateDirectory(Path.GetDirectoryName(logSavePath)); File.WriteAllLines(logSavePath, allFilePaths, Encoding.UTF8); Console.WriteLine($"文件列表拉取完成,共获取{allFilePaths.Count}个文件,日志已保存至:{logSavePath}"); } } }
性能优化说明
- 直接调用ADLS原生
GetPathsAsync接口并设置recursive=true,无需手动逐层遍历子文件夹,接口调用次数减少90%以上 - 可根据文件量级调整分页大小,通过
GetPathsAsync(pageSizeHint: 5000)参数设置单页返回条数,进一步减少接口往返开销 - 相比ADF Lookup活动,省去了Data Factory的中间层调度开销,同等数据量下性能可提升3~10倍
适配ADLS Gen1说明
如果你使用的是ADLS Gen1,只需替换NuGet包为Microsoft.Azure.DataLake.Store,调用EnumerateDirectoryAsync方法实现遍历即可,整体逻辑和上面的示例一致。
内容的提问来源于stack exchange,提问作者user3843858
相关产品推荐
相关产品推荐

