如何突破260个字符的路径限制

10 浏览
0 Comments

如何突破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

谢谢你的帮助!

0
0 Comments

如何通过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";

需要注意的是,您必须具有适当的权限才能访问长路径。如果您在应用程序中遇到问题,请确保应用程序以管理员身份运行。

希望这可以帮助您解决问题!

0