如何突破260个字符的路径限制
如何突破260个字符的路径限制
我目前正在使用.NET框架和C#进行一个项目。我想知道如何去除路径的260个字符限制。我尝试过去regedit和gpedit,但都没有起作用。我尝试在路径前加上"\?"的前缀,但路径无法识别。这里是C#代码的示例:
private static void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs) { // 获取指定目录的子目录。 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 (!Directory.Exists(destDirName)) { Directory.CreateDirectory(destDirName); } // 获取目录中的文件并将它们复制到新位置。 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 (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; -- 这是我尝试过的方法 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); //设置其余的进程设置 proc.Start(); } catch(Exception ex) { Erreurs.Add(ex.Message); } } } }
这是我的批处理代码(我想将'loclogic'和'sousdoss'传递给%1和%2):
xcopy "%1" "%2" /c /h /e /r /y /s
谢谢你的帮助!
如何通过260个字符的路径限制?在Windows 10中,从版本1607开始,已经移除了常见的Win32文件和目录函数中的MAX_PATH限制。但是,您必须选择新行为。
要启用新的长路径行为,必须同时满足以下两个条件:
计算机\ 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以来,路径被规范化为\\?。
.NET Framework不再需要长路径语法,但这并不意味着不支持长路径。您可以通过在路径前添加\\?来使路径以\\?\开头。以下是一个示例代码:
string longPath = @"\\?\C:\very\long\path";
需要注意的是,您必须具有适当的权限才能访问长路径。如果您在应用程序中遇到问题,请确保应用程序以管理员身份运行。
希望这可以帮助您解决问题!