directory.getfiles 默认不递归子目录,需显式传 searchoption.alldirectories;大目录应优先用 directory.enumeratefiles 以节省内存;需手动捕获 unauthorizedaccessexception 实现跳过权限不足目录;.net core 3.1+ 支持长路径和中文路径,但需系统启用 longpathsenabled。

Directory.GetFiles 用错参数会漏文件
默认只查当前目录,不进子文件夹——这是最常踩的坑。想拿全部文件,必须显式传 SearchOption.AllDirectories,否则 Directory.GetFiles("path") 返回空数组或结果不全,尤其在嵌套深的项目里根本发现不了。
常见错误现象:Directory.GetFiles("src") 只返回 src 下的 .cs 文件,src/Models 里的一个都不出现。
- 正确写法:
Directory.GetFiles("src", "*.cs", SearchOption.AllDirectories) - 如果只想查特定扩展名,通配符必须作为第二个参数;传
"*"能查所有文件,但性能略低 - 注意路径末尾斜杠不影响结果,但传入 null 或不存在路径会直接抛
DirectoryNotFoundException
Directory.EnumerateFiles 更适合大目录
当文件数超过几千,Directory.GetFiles 会一次性加载全部路径到内存,容易卡顿甚至 OOM;Directory.EnumerateFiles 返回 IEnumerable<string></string>,边遍历边 yield,内存友好得多。
使用场景:扫描日志目录、用户上传文件夹、生成资源清单。
- 基础用法一致:
Directory.EnumerateFiles("logs", "*.log", SearchOption.AllDirectories) - 它不支持按创建时间过滤,要筛选得自己加
.Where(f => File.GetCreationTime(f) > DateTime.Now.AddDays(-7)) - 注意:枚举过程中若文件被删除,可能抛
IOException,建议外层 try/catch
递归遍历时跳过权限不足的文件夹
遇到 UnauthorizedAccessException 是常态,比如访问 C:Program Files 或系统隐藏目录。不处理就会中断整个遍历。
标准 API 不提供内置跳过机制,得手动捕获异常并继续。
- 用
Directory.EnumerateDirectories+ 递归函数更可控,每层都包 try/catch - 示例关键逻辑:
foreach (var dir in Directory.EnumerateDirectories(root)) { try { ProcessDir(dir); } catch (UnauthorizedAccessException) { continue; } } - 别依赖
Directory.GetAccessControl预检——它本身也可能抛异常,且 Windows ACL 判断开销大
中文路径和长路径在 .NET Core/.NET 5+ 默认没问题
旧版 .NET Framework 对 >260 字符路径或含 Unicode 的路径常报 PathTooLongException 或乱码,但现在只要项目目标是 netcoreapp3.1 或更高,且 Windows 启用了长路径支持(注册表 LongPathsEnabled=1),就基本不用额外处理。
容易被忽略的地方:开发时在 VS 里跑正常,部署到某台老服务器却失败——大概率是那台机器没开长路径策略,或者运行账户没权限读取 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlFileSystem。
- 检查方式:PowerShell 运行
(Get-ItemProperty "HKLM:SYSTEMCurrentControlSetControlFileSystem").LongPathsEnabled - 代码里硬加
\?前缀反而可能破坏跨平台逻辑,.NET 5+ 已自动处理,不建议手动拼 - 如果必须兼容旧系统,优先用
EnumerateFiles+ 分块处理,避免一次性构造超长路径字符串











