Windows默认路径长度限制为260字符(MAX_PATH),超出时IO方法抛出PathTooLongException或返回false;启用长路径需系统组策略+应用配置双满足,或使用?前缀绕过限制。

Windows默认路径长度限制是什么
Windows API 默认限制路径长度为260字符(即 MAX_PATH),超出时 File.Exists、File.ReadAllText 等方法会直接抛出 System.IO.PathTooLongException 或返回 false,而非真实文件状态。这不是C#语言限制,而是底层 Win32 API 的硬性约束。
启用长路径支持的两种方式
必须同时满足系统级和应用级配置,缺一不可:
- Windows 10 1607+ 或 Windows Server 2016+,且在组策略中启用「启用 Win32 长路径」(路径:
计算机配置 → 管理模板 → 系统 → 文件系统 → 启用 Win32 长路径) - .NET 应用需在
app.config或web.config中添加<appcontextswitchoverrides value="Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false"></appcontextswitchoverrides>;.NET Core / .NET 5+ 默认启用,但需确保项目文件含<EnableLongPathSupport>true</EnableLongPathSupport>
使用 \? 前缀绕过限制(兼容旧系统)
这是最稳定、无需系统策略变更的方式,适用于所有 Windows 版本,但要求路径为绝对路径且不包含相对符号(如 ..):
- 手动拼接前缀:将
C:erylongpath oile.txt改为\?C:erylongpath oile.txt - 注意:
\?会禁用路径规范化,所以\?C:..不会被简化为C:,必须传入已解析的绝对路径 - 多数
System.IO方法支持该前缀,但Directory.GetFiles等枚举类方法可能仍受限,此时应改用Directory.EnumerateFiles+\?路径
string longPath = @"C:erylong...ile.txt";
string extendedPath = $@"\?{Path.GetFullPath(longPath)}";
string content = File.ReadAllText(extendedPath); // ✅ 可读取
实际读取时仍需注意的坑
即使路径能通过,某些操作仍可能失败:
-
FileInfo构造函数接受长路径,但调用FileInfo.Length或FileInfo.Exists可能触发异常 —— 改用new FileInfo(extendedPath).Length才安全 - 第三方库(如
Newtonsoft.Json的JsonConvert.DeserializeObject<T>(File.ReadAllText(...)))内部不处理\?,需先读取为字符串再解析 - 调试时 Visual Studio 输出窗口可能截断超长路径显示,建议用
Debugger.Log或日志库输出原始路径验证
真正麻烦的不是“怎么读”,而是整个路径生命周期里每一步是否都保持了扩展格式 —— 从获取、拼接、传递到最终 IO 调用,中间任意一环还原成普通路径,就前功尽弃。










