如何通过 260 个字符的路径限制 [重复]
Posted
技术标签:
【中文标题】如何通过 260 个字符的路径限制 [重复]【英文标题】:How to pass through the 260 characters path limit [duplicate] 【发布时间】:2021-12-19 09:03:35 【问题描述】:我目前正在为一个项目使用 .Net Framework 和 C#。
我想知道如何取消路径的 260 个字符限制。
我已经尝试访问 regedit 和 gpedit,但没有任何效果。我试着把“\?”前缀,但路径无法识别。
这里是 C# 代码示例:
private static void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs)
// Get the subdirectories for the specified directory.
DirectoryInfo dir = new DirectoryInfo(sourceDirName);
if (!dir.Exists)
throw new DirectoryNotFoundException(
"Le répertoire source n'existe pas ou n'est pas accessible : "
+ sourceDirName);
DirectoryInfo[] dirs = dir.GetDirectories();
// If the destination directory doesn't exist, create it.
if (!Directory.Exists(destDirName))
Directory.CreateDirectory(destDirName);
// Get the files in the directory and copy them to the new location.
FileInfo[] files = dir.GetFiles();
foreach (FileInfo file in files)
temppath = Path.Combine(destDirName, file.Name);
try
file.CopyTo(temppath, false);
catch (Exception ex)
Erreurs.Add(ex.Message);
Erreurs.Add(temppath);
// If copying subdirectories, copy them and their contents to new location.
if (copySubDirs)
/*Utility.NetworkDrive.MapNetworkDrive("R", @"\\unc\path");
var dirs1 = Directory.GetDirectories("R:");
Utility.NetworkDrive.DisconnectNetworkDrive("R", true);*/
foreach (DirectoryInfo subdir in dirs)
temppath = Path.Combine(destDirName, subdir.Name);
// string fullpath = @"\\?\" + subdir.FullName; -- HERE'S WHAT I'VE TRIED
try
string sousdoss = subdir.FullName;
string loclogic = Application.StartupPath + @"\Xcopy.bat";
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = Application.StartupPath + @"\Xcopy.bat";
proc.StartInfo.Arguments = String.Format("0 1 2",loclogic, sousdoss, temppath);
//set the rest of the process settings
proc.Start();
catch(Exception ex)
Erreurs.Add(ex.Message);
这是我的批处理代码(我想将 'loclogic' 和 'sousdoss' 传递给 %1 和 %2):
xcopy "%1" "%2" /c /h /e /r /y /s
感谢您的帮助!
【问题讨论】:
您使用的是哪个 .NET Framework 版本?自 .NET Framework 4.6.2 起,该限制不再适用 为什么要使用批处理文件进行实际复制?无需调用标准的 xcopy 命令,甚至无需将其打包到批处理文件中。 你为什么要使用xcopy.bat
????????? xcopy
曾经是一个 DOS 实用程序,旨在克服内置 copy
command 的限制。在 MS-DOS 中,不是没有这种限制的 Windows NT CLI。当您拥有 PowerShell 时,没有理由使用 DOS 命令。或者更好的实用程序,例如 robocopy
这是XY Problem 的情况。您遇到问题 X(复制目录及其内容)并假设解决方案是 Y(使用 xcopy CLI 实用程序)。当失败时,您询问的是 Y,而不是实际的问题 X。the actual question 的答案不仅展示了如何复制文件夹,还展示了如何并行复制文件夹,就像 robocopy
所做的那样。首先,创建文件夹树。然后复制文件
我正在使用 4.7.2 但我仍然卡住,无法解决我的问题..
【参考方案1】:
更新:正如@Panagiotis Kanavos 指出的那样:
" 以 \?.... 开头的路径可以寻址卷、流、 快照,最长可达 32K。”
你可以Enable Long Paths in Windows 10, Version 1607, and Later
但正如文章所述,它是一种选择加入功能。
从 Windows 10 版本 1607 开始,MAX_PATH 限制已从常见的 Win32 文件和目录函数中删除。但是,您必须选择加入新行为。
要启用新的长路径行为,以下两个条件 必须满足:
注册表项 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled (类型:REG_DWORD)必须存在并设置为 1。键的值将是 在第一次调用受影响的对象后由系统(每个进程)缓存 Win32 文件或目录函数(参见下面的列表 职能)。在生命周期内不会重新加载注册表项 的过程。为了让系统上的所有应用程序都能识别 键的值,可能需要重新启动,因为某些进程 可能在设置密钥之前就开始了。
【讨论】:
从 .NET Framework 4.6.2 开始就不需要了 它们不在任何版本的 Windows NT 行中。只有 DOS 风格的路径和函数受到影响。以\\?\....
开头的路径可以处理卷、流、快照,最长可达 32K。 4.6.2 之前的 .NET 试图对操作系统进行二次猜测。从 4.6.2 开始,路径被规范化为 `\\?`。
链接的文章说你不再需要使用长路径语法,并不是说不支持长路径
感谢您的帮助,但我怎样才能让路径以 \\?\ 开头?我应该添加前缀吗?如果是的话,我已经尝试过了……你有任何代码示例吗?
感谢 Mitch 的回答,但我已经更改并应用了注册表中的密钥,并更改了应该启用长路径的组策略中的参数。我已经重新启动了计算机,但现在没有任何变化以上是关于如何通过 260 个字符的路径限制 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
[环境配置][C++]ceres编译提示超过 OS 最大路径限制。完全限定的文件名必须少于 260 个字符
OpenFileDialog 在超过 260 个字符的路径上返回空字符串(或根本不返回)
windows10如何解除文件路径最大长度限制?(xftp从ubuntu拷贝文件到windows错误失败)