V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fengwq
V2EX  ›  Windows

Windows 文件路径长度限制是多少个字符? 244、255、256、260?「启用长路径」有用吗?

  •  3
     
  •   fengwq ·
    PRO
    · 17 小时 23 分钟前 · 1041 次点击

    到底是多少个字符?

    256

    微软文档《 最大路径长度限制 》( Maximum Path Length Limitation ):
    在 Windows API 中,路径的最大长度为 MAX_PATH ,为 260 个字符
    系统按以下顺序构建本地路径:驱动器号、冒号、反斜杠、用反斜杠分隔的路径和终止 null 字符。
    例如,驱动器 D 上的最大路径为:
    D:\某个 256 个字符的路径字符串<NUL>
    其中 <NUL> 表示当前系统代码页的不可见终止 null 字符。(<> 字符在此用于醒目用途,不能作为有效路径字符串的一部分。)

    文档到这里的意思是:路径总长度是 260 个字符,掐头去尾中间可用的部分是 256 个字符(英文版也是 256 )。

    那么来测试一下。
    测试用例

    240-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    
    251-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    
    252-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    

    字符串计数工具

    244

    D:\ 路径,使用「文件资源管理器( Explorer.exe )」创建文件或文件夹,只能创建 244 个字符的文件、文件夹

    目标路径太长.png
    这张图是在一个 D:\244 字符 的文件夹里,继续新建文件夹的报错「目标路径太长」。

    然后我发现群晖文档《 如果 Windows 文件资源管理器提示文件名过长,我该怎么办? 》讲得很清楚:
    最大可用路径长度为 244 个字符,因为 Windows 文件资源管理器为 8.3 文件名格式预留了 12 个字符。」

    其实微软文档《最大路径长度限制》也提到了:「使用 API 创建目录时,指定的路径不能太长以致于无法附加 8.3 文件名(即目录名不能超过 MAX_PATH 减 12 )」。只是不太显眼,容易被忽略。

    「 8.3 文件名」是什么?

    在 MS-DOS FAT 文件系统,基础文件名最多 8 个字符,扩展名最多 3 个字符,总共支持 12 个字符(包括点分隔符),所以被称为 8.3 文件名。Windows FAT 和 NTFS 文件系统不限于 8.3 文件名,因为它们有长文件名支持功能,但也支持 8.3 版本的长文件名。

    在 Win10 、Win11 系统,系统盘默认启用 8.3 文件名,非系统盘默认禁用 8.3 文件名
    可以用 fsutil 查询(需要管理员权限):

    fsutil 8dot3name query D:
    卷状态为: 1 (8dot3 名称创建已禁用)
    注册表状态为: 2 (按卷设置 - 默认值)
    
    基于上述设置,8dot3 名称创建已在“D:”上禁用
    

    在启用了 8.3 文件名的盘中,创建文件名超过 12 个字符的文件,系统会自动生成相应的 8.3 文件名,即「短文件名」

    微软文档《 命名文件、路径和命名空间
    微软文档《 8.3 Filename
    关于 Windows 文件名和路径名的那些事
    联想文档《 什么是 8.3 格式?

    所以,文件资源管理器为了兼容性,进一步限制,就只能创建 256 - 12 = 244 个字符的文件、文件夹。

    255

    在「群晖文档」中提到:「此限制仅适用于 Windows 文件资源管理器和 Windows API 。使用 Windows PowerShell 或 命令提示符 中的 ren 或 rename 命令重命名文件不受影响。」

    测试后确实,使用 ren 可以创建超过 244 个字符的文件、文件夹。
    但是,文件不能超过 255 个字符,文件夹不能超过 254 个字符:( -LiteralPath 是必须的):

    ren -LiteralPath "1" "252-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000345"
    ren : 指定的路径或文件名太长,或者两者都太长。完全限定文件名必须少于 260 个字符,并且目录名必须少于 248 个字符。
    所在位置 行:1 字符: 1
    + ren -LiteralPath "1" "252-0000000000000000000000000000000000000000000 ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : WriteError: (D:\1:String) [Rename-Item], PathTooLongException
        + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand
    

    报错是:「完全限定文件名必须少于 260 个字符,并且目录名必须少于 248 个字符」。
    微软文档《 Git 跨平台兼容性 》:「对于具有 .NET 的目录,完全限定的文件名必须少于 260 个字符,目录名称必须少于 248 个字符」。

    为什么文件最多 255 个字符?既不是 256 也不是 244 ,代码实现与文档《最大路径长度限制》是对不上的。
    在另一篇微软文档《 Filename 》倒是提到了 255 个字符:A filename MUST be at least one character but no more than 255 characters in length.

    为什么文件夹最多 254 个字符?这个数字更是哪都对不上。还有,使用 mkdir 只能创建 244 个字符的文件夹。

    「启用长路径」有用吗?

    「启用长路径」也就是注册表值 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD) 设置为 1 。

    微软文档《最大路径长度限制》:启用之后,「允许最大总路径长度为 32767 个字符的扩展长度路径」,要指定扩展长度路径,要使用 \\?\ 前缀。例如,\\?\D:\非常长的路径

    它只对部分 Windows 函数生效

    单个文件、文件夹的名字上限还是 255

    前面测试的文件资源管理器,PowerShell 的 New-Item 、Rename-Item 等命令仍然不完全支持长路径
    New-Item 、Rename-Item 具体调用的是什么函数?这个问题超出我能力范围了。

    启用长路径之后,mkdirNew-Item -ItemType Directory -Path)可以创建 255 个字符的文件夹,限制只增加了 11 个字符,在这个文件夹下也能继续创建文件。

    mkdir "252-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000345"
    
        目录: D:\
    Mode                 LastWriteTime         Length Name
    ----                 -------------         ------ ----
    d-----         2026-3-19     21:49                252-00000000000000000000000000000000000000000000000000000000000000000
                                                      000000000000000000000000000000000000000000000000000000000000000000000
                                                      000000000000000000000000000000000000000000000000000000000000000000000
                                                      000000000000000000000000000000000000000000000345
    

    长路径语法 \\?\

    如果按文档,加上 \\?\ 反而会报错:

    mkdir "\\?\D:\252-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000345"
    mkdir : 路径不能为空字符串或全为空白。
    参数名: path2
    所在位置 行:1 字符: 1
    + mkdir "\\?\D:\252-000000000000000000000000000000000000000000000000000 ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidArgument: (\\?\D:\252-0000...000000000000345:String) [New-Item],ArgumentException
        + FullyQualifiedErrorId : CreateDirectoryArgumentError,Microsoft.PowerShell.Commands.NewItemCommand
    

    New-Item 创建文件时,支持 \\?\ 语法:New-Item "\\?\D:\123" 。但创建文件夹时,又不支持了。
    Rename-Item 支持 \\?\ 语法:Rename-Item -LiteralPath "\\?\D:\1" "\\?\D:\123" 能正常运行。
    Remove-Item 支持 \\?\ 语法,而且对超过 255 个字符的命令没有报错。还好它是支持的,否则创建之后不能删除就麻烦了。

    PowerShell 5.1 启用长路径前 启用后
    文件资源管理器 244 244
    mkdir 244 255
    ni (文件) 255 255
    ren 文件夹 254 ,文件 255 255
    del 超过 4000

    255 还不到 32767 零头的一半。

    PowerShell 7

    Win10 、Win11 默认的 PowerShell 是 5.1 版本的
    $PSVersionTable 查看版本。

    我下载了 PowerShell 7.6.0 版本进行测试。

    PowerShell 7.6.0 启用长路径前 启用后
    mkdir 255 255
    ni (文件) 255 255
    ren 文件、文件夹都是 255 255
    del 超过 4000

    统一是 255 字符了,比 5.1 版本好一些,但还是不支持长路径,使用 \\?\ 语法也不行。

    多层文件夹的路径上限

    虽然单个文件、文件夹的名字上限是 255 个字符,但多层目录的限制又不一样了。在未启用长路径的情况下,就可以创建超过 4000 个字符的路径。还能在这个路径下新建 txt ,并且用「记事本」读写:

    4200 多个字符路径.png

    而且,到了这个长度,「文件资源管理器」报错是「目录名称无效」:

    explorer.exe-目录名称无效.png

    「启用长路径」之后这个报错也还在。

    就到此为止吧,暂时不继续研究了。

    第三方软件的支持情况

    PikPak

    终于到了我研究这个问题的初心了!
    我发现 PikPak 的 Windows 客户端下载文件( v2.8.16.5418 ),文件名超过 100 个字符的部分会被截断。网页端没有这个问题。
    于是我去找客服提了 bug ,只过了 11 天,官方就在 2.9.0 版本修复了。我要给 PikPak 的客服和研发点赞,认真处理用户反馈。

    修复后的逻辑是这样的:
    总路径长度支持 500 个字符:包括 246 个字符的文件名,246 个字符的上层路径(可以有多层文件夹):
    \\?\D:\246 个字符的路径\246 个字符的文件名
    如果超过限制,会弹出「下载失败」的通知。

    总结

    截至 2026-03 月,使用 Windows 系统,路径长度(文件名)最好控制在 244 个字符以内
    单个文件、文件夹的名字上限是 255 个字符。
    多层文件夹的路径上限超过 4000 个字符。
    「启用长路径」的作用鸡肋。

    提醒:4 个字符的扩展名是很常见的
    .avif .docx .flac .html .jpeg .json .m3u8 .pptx .webp .xlsx

    参考资料

    Windows10 下路径名称限制

    群晖文档《 Cloud Station Backup 帮助 》:
    Cloud Station Backup 默认在以下情况下不会备份文件和文件夹:
    对于 Windows:

    • 文件夹或文件路径长度超过 247 个字符。
    • 文件名称长度超过 255 个字符。

    看了但没用上

    30 年前的技术债引发 win11 离奇 bug ,微软不敢修!
    请教一下,windows 系统变量字符过长有什么好的解决方案!

    更新日志

    2026-03-21 第一版
    2026-03-19 开始写


    欢迎关注我的频道: https://t.me/fengwq

    17 条回复    2026-03-27 17:04:36 +08:00
    liuxue
        1
    liuxue  
       16 小时 51 分钟前 via iPhone
    我发现这个问题是因为用户反映在网页中上传文件夹时,文件上传失败了,问题排查了 2 天
    fyq
        2
    fyq  
       16 小时 43 分钟前   ❤️ 2
    这才是 V 站该讨论的东西啊
    mgcnrx11
        3
    mgcnrx11  
       16 小时 21 分钟前
    我就问问,node_modules 会因为路径长度不能超过 255 引发的问题,存在吗?普遍吗?
    ca2oh4
        4
    ca2oh4  
       15 小时 57 分钟前
    @mgcnrx11 基本上遇不到,但是 rust 有可能有
    adoal
        5
    adoal  
       15 小时 40 分钟前
    你那个 mkdir 的例子,在 cmd 下反而可以成功。
    Mithril
        6
    Mithril  
       14 小时 28 分钟前
    @mgcnrx11 不太普遍,但是有。这种自身嵌套就很长的程序生成文件都可能出问题,包括但不限于 npm 这种包管理,Git/Mercurial 的 checkout ,还有压缩包的解压。

    特别是你把.git 或者.hg 打到压缩包里,然后又找了个比较深的路径解压,很容易出问题。
    mrzhiin
        7
    mrzhiin  
       14 小时 13 分钟前
    @mgcnrx11 我使用 pnpm 和 react-native 在 windows 下就遇到了
    xaxb
        8
    xaxb  
       13 小时 0 分钟前
    遇到过该问题,Windows 下解压不出来,提示文件名过长,换到 Linux 下解压改名再传出来解决的。
    FarAhead
        9
    FarAhead  
       12 小时 57 分钟前
    sh
    Windows 11 上有这个选项了
    ksc010
        10
    ksc010  
       12 小时 57 分钟前
    @xaxb 我也是前段时间遇到解压的问题, 压缩包文件名很长, 里面有嵌套了好几个很长的文件名
    最后把压缩包名词删除了很多才顺利解压
    codehz
        11
    codehz  
       12 小时 27 分钟前   ❤️ 1
    你用 NT API 的话,最大长度就直接 32767 个 utf-16 了(不是传入 nt 路径给 win32 api ,是真实调用 Nt 开头的 api ,手动构造 UNICODE_STRING 对象才可以,这个限制的来源是 UNICODE_STRING 的长度字段 USHORT 决定的()
    DualVectorFoil
        12
    DualVectorFoil  
       12 小时 6 分钟前
    DualVectorFoil
        13
    DualVectorFoil  
       12 小时 5 分钟前
    @DualVectorFoil 对不起我是瞎子第一个就是啊😂
    fengwq
        14
    fengwq  
    OP
    PRO
       12 小时 5 分钟前
    @codehz #11 那不写代码的话,有没有调用 NT API 的方法?我知道调用的 API 不一样,但我不了解 Windows 开发,我问了 AI 是没找到方法。
    Opportunity
        15
    Opportunity  
       11 小时 56 分钟前
    @mgcnrx11 pnpm 会用哈希做文件名
    ShineyWang
        16
    ShineyWang  
       11 小时 55 分钟前
    我们公司项目喜欢取一大串名字,代码文件又会带项目名全名
    导致 windows 服务器编译时经常遇到这个问题

    后来就缩减了,改简写+单独编译目录
    codehz
        17
    codehz  
       11 小时 18 分钟前
    @fengwq 你可能是想让那些旧的 app 一键支持长文件名?这不可能,因为人家代码里用的很可能就是栈上的固定尺寸 char path[MAX_PATH]的数组,就算能强迫 api 支持长文件名,程序本身也无法正确处理
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   917 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 20:23 · PVG 04:23 · LAX 13:23 · JFK 16:23
    ♥ Do have faith in what you're doing.