如何通过 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错误失败)

NTFS 中的文件路径是不是有长度限制?

路径超过 260 个字符时出现 System.IO.DirectoryNotFoundException [重复]

文件路径长了255个字符,这个“255”如何解释?