代码之家  ›  专栏  ›  技术社区  ›  Jeffrey Cameron

为什么Windows中存在260个字符的路径长度限制?

  •  357
  • Jeffrey Cameron  · 技术社区  · 16 年前

    我曾在不恰当的时候遇到过几次这个问题:

    • 在源代码管理中存储deep Fitnesse wiki树

    为什么会有这样的限制?

    为什么它还没有被移除?

    你如何应对路径限制? 不,切换到Linux或Mac OS X不是这个问题的有效答案;)

    12 回复  |  直到 6 年前
        1
  •  255
  •   John Cummings    7 年前

    引用这篇文章 https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file#maximum-path-length-limitation

    最大路径长度限制

    最大路径 ,定义为260个字符。本地路径按以下顺序构造:驱动器号、冒号、反斜杠、由反斜杠分隔的名称组件和终止的空字符。例如,驱动器D上的最大路径为“D:\ <NUL>其中“<NUL>表示当前系统代码页的不可见终止空字符(人物<&燃气轮机;此处使用是为了视觉清晰,不能作为有效路径字符串的一部分。)

    现在我们看到它是1+2+256+1或[drive][:\][path][null]=260。可以假设256是DOS时代的合理固定字符串长度。回到DOSAPI,我们意识到系统跟踪每个驱动器的当前路径,我们已经 26 (32 with symbols) maximum drives (和当前目录)。

    INT 0x21 AH=0x47表示此函数返回不带驱动器号和初始反斜杠的路径描述。因此,我们看到系统将CWD存储为一对(驱动器,路径),您通过指定驱动器(1=a,2=B,)来请求路径,如果您指定了0,那么它将假定INT 0x21 AH=0x15 AL=0x19返回的驱动器路径。现在我们知道为什么是260而不是256,因为这4个字节没有存储在路径字符串中。

    为什么选择256字节的路径字符串,因为640K的内存足够了。

        2
  •  161
  •   dthorpe    15 年前

    严格来说,这不是真的,因为NTFS文件系统支持最多32k个字符的路径。您可以使用win32 api和“ \\?\

    详细解释.Net中的长路径 BCL team blog
    一个小摘录突出了这一问题的长途跋涉

    \\?\ 前缀可用于大多数与文件相关的Windows API,但不是所有Windows API。例如,如果文件名长于MAX_PATH,则将模块映射到调用进程地址的LoadLibrary将失败。这意味着MoveFile将允许您将DLL移动到路径长度超过260个字符的位置,但当您尝试加载DLL时,它将失败。整个Windows API中都有类似的示例;存在一些变通办法,但它们是基于个案的。

        3
  •  125
  •   Jonathan Potter    6 年前

    为什么? 限制是否仍然存在。当然,现代窗户可以增加窗户的侧面 MAX_PATH 允许更长的路径。为什么没有取消限制?

    • 无法删除它的原因是Windows承诺它永远不会更改。

    通过API合同,Windows向所有应用程序保证标准文件API返回的路径不会超过 260

    考虑以下事项 对的

    WIN32_FIND_DATA findData;
    
    FindFirstFile("C:\Contoso\*", ref findData);
    

    窗户 我的程序,它将填充我的 WIN32_FIND_DATA 结构:

    WIN32_FIND_DATA {
       DWORD    dwFileAttributes;
       FILETIME ftCreationTime;
       FILETIME ftLastAccessTime;
       FILETIME ftLastWriteTime;
       //...
       TCHAR    cFileName[MAX_PATH];
       //..
    }
    

    ,Windows API做到了。我的应用程序使用了定义的值。

    我的结构定义正确,只分配 592 字节总数。这意味着我只能接收小于的文件名 260 答应 告诉我,如果我正确编写了我的应用程序,我的应用程序将在未来继续工作。

    然后我的现有应用程序(正确使用了正确的API)将失败。

    最大路径 常数,他们首先需要确保没有现有的应用程序出现故障。例如,我仍然拥有并使用一个为在Windows3.11上运行而编写的Windows应用程序。它仍然在64位Windows10上运行。这就是向后兼容性让你得到的。

    微软 创建一种使用完整32768路径名的方法;但他们必须创建一个新的API合同来实现这一点。首先,你应该使用 壳牌API

    但它们也不能破坏现有的用户应用程序。绝大多数应用程序都是这样做的 使用shell api进行文件工作。每个人都只是打电话 FindFirstFile / FindNextFile 今天到此为止。

        4
  •  65
  •   Bram Vanroy    8 年前

    remove the limitation

    提示 从Windows10版本1607开始,已从常见的Win32文件和目录函数中删除了MAX_路径限制。但是,您必须选择新的行为。

    注册表项允许您启用或禁用新的长路径行为。要启用长路径行为,请将注册表项设置为 HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (类型: REG_DWORD ). 在第一次调用受影响的Win32文件或目录函数(如下列表)后,系统(每个进程)将缓存该键的值。在进程的生存期内,不会重新加载注册表项。为了让系统上的所有应用程序识别密钥的值,可能需要重新启动,因为某些进程可能在设置密钥之前已经启动。 Computer Configuration > Administrative Templates > System > Filesystem > Enable NTFS long paths . 您还可以通过清单为每个应用启用新的长路径行为:

    <application xmlns="urn:schemas-microsoft-com:asm.v3">
        <windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
            <ws2:longPathAware>true</ws2:longPathAware>
        </windowsSettings>
    </application>
    
        5
  •  33
  •   BaCaRoZzo Indie Dev    11 年前

    您可以将文件夹装载为驱动器。从命令行,如果您有路径 C:\path\to\long\folder X:

    subst x: \path\to\long\folder
    
        6
  •  19
  •   BaCaRoZzo Indie Dev    11 年前

    处理路径限制的一种方法是使用符号链接缩短路径条目。

    例如:

    1. C:\p 目录以保留指向长路径的短链接
    2. mklink /J C:\p\foo C:\Some\Crazy\Long\Path\foo
    3. 添加 C:\p\foo 走你的路,而不是漫长的路
        7
  •  15
  •   MovGP0    7 年前

    Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem' -Name LongPathsEnabled -Type DWord -Value 1 
    

    另一个版本是在中使用组策略 Computer Configuration / Administrative Templates System Filesystem :

    Group Policy Editor

        8
  •  10
  •   Brie    11 年前

    至于 为什么? 这仍然存在- MS不认为它是优先考虑的,并且在推进OS(至少在这种情况下)时考虑向后兼容性。

    我使用的一种解决方法是对路径中的目录使用“短名称”,而不是它们的标准、人类可读版本。所以 例如 C:\Program Files\ 我会用 C:\PROGRA~1\ dir /x .

        9
  •  8
  •   Community Mohan Dere    9 年前

    7zip 打包(和解包)路径长度敏感的文件似乎是一种可行的解决方法。我用它来传输几个IDE安装(那些Eclipse插件路径,yikes!)和成堆的自动生成文档,到目前为止还没有出现任何问题。

    不太清楚它是如何避开Windows设置的260个字符的限制的(从技术角度来看),但是,嘿,它工作了!

    有关SourceForge页面的更多详细信息 here

    “NTFS实际上可以支持多达32000个字符的路径名 长度。”

    但它在SFX代码中被禁用。有些用户不喜欢长路径,因为 他们不知道如何与他们合作。这就是为什么我

    release notes

    9.32阿尔法2013-12-01

    • 改进了对超过260个字符的文件路径名的支持。

    4.44测试版2007-01-20

    重要提示: 要使其正常工作,您需要在 7拉链 this question 了解更多信息。

        10
  •  6
  •   shA.t Rami Jamleh    7 年前

    确实如此,出于某种原因,它是默认值,但您可以使用以下注册表项轻松覆盖它:

    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
    "LongPathsEnabled"=dword:00000001
    

    见: https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/

        11
  •  3
  •   eliblanco87    8 年前

    另一种处理方法是使用Cygwin,这取决于您想对文件做什么(即Cygwin命令是否适合您的需要)

    例如,它允许复制、移动或重命名即使是Windows资源管理器也无法复制、移动或重命名的文件。或者当然要处理它们的内容,比如md5sum、grep、gzip等等。