reg add HKLM\SYSTEM\CurrentControlSet\Control\FileSystem /v LongPathsEnabled /t REG_DWORD /d 1 /f robocopy C:\src D:\dst /E /R:1 /W:1
备份脚本在 Windows 上拷到一半报 PathTooLongException,完整路径 261 个字符。同一批文件在 Linux 上跑得好好的,只有一层很深的缓存目录过不去。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,Win32 API 的路径上限是 MAX_PATH 260,包含盘符、分隔符和结尾的 NUL。普通 .NET 调用走的还是旧接口,超过就直接抛异常,和磁盘格式无关。
「Windows 长路径 260」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
处理上按这个顺序:先打开系统级长路径开关 LongPathsEnabled 注册表项;路径前加 \\?\ 前缀绕过 MAX_PATH 解析;.NET 里同步打开 AppContext 的开关 别只改注册表;源头还是缩短目录层级 顺手清掉过深的缓存目录。
改完只确认一件事:原来失败的 261 字符文件能复制过去 脚本退出码从 8 变成 0。
