windows下c#读写长路径失败是因.net默认未启用长路径支持,受max_path限制;.net 5+在win10 1607+且注册表longpathsenabled=1时默认支持,但需目标框架≥net5.0且正确拼接?绝对路径。

Windows下C#读写长路径文件为什么失败
因为.NET默认调用Windows API时未启用长路径支持,MAX_PATH(260字符)限制会直接触发System.IO.DirectoryNotFoundException或System.IO.IOException,哪怕路径本身在Windows 10 1607+已支持\?前缀。关键不是C#语言限制,而是.NET运行时和系统API的协同方式没打开。
.NET Core 5+ 和 .NET 5+ 默认支持长路径吗
是的,但仅限于**启用长路径策略的Windows系统**,且需满足两个条件:
- Windows 10 version 1607+ 且注册表项
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlFileSystemLongPathsEnabled值为1 - .NET应用目标框架为
net5.0或更高(包括net6.0、net8.0),且未显式禁用长路径
注意:netcoreapp3.1 及更早版本不自动启用,必须手动加\?前缀;net472等.NET Framework版本则完全依赖注册表+前缀组合,且部分API(如Directory.GetFiles)仍可能内部截断。
如何安全地拼接并使用\?前缀路径
不能简单字符串拼接——?只对**绝对路径**有效,且要求盘符后紧跟:,不能有尾部反斜杠(除非是根目录)。推荐用Path.GetFullPath标准化后再注入前缀:
string longPath = @"C:erydeepolderwithmanysubdirectoriesile.txt";
string normalized = Path.GetFullPath(longPath); // 确保是绝对路径,处理..和.
string extendedPath = @"\?" + normalized.Replace("/", "\"); // 统一为反斜杠
// 后续所有IO操作都用 extendedPath
File.WriteAllText(extendedPath, "data");
常见错误:
- 对相对路径加
\?→ 报错Invalid argument - 路径末尾带
(如\?C:dir)→ 某些API拒绝解析 - 混用正斜杠
/→ Windows API不识别
哪些IO方法对长路径仍不可靠
即使加了\?,以下方法在部分.NET版本中仍有缺陷:
-
Directory.GetFiles(path, "*.*", SearchOption.AllDirectories):内部可能用短路径逻辑遍历,建议改用Directory.EnumerateFiles+ 手动递归 -
DriveInfo.RootDirectory:返回的根路径不含\?,不能直接拼接 -
FileInfo.FullName:始终返回常规路径,不会自动转为扩展格式
真正稳定的做法是:所有路径输入先过Path.GetFullPath,再统一加\?前缀,且全程避免依赖FileInfo/DirectoryInfo的自动路径生成逻辑。










