微软文档《 最大路径长度限制 》( 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
在 D:\ 路径,使用「文件资源管理器( Explorer.exe )」创建文件或文件夹,只能创建 244 个字符的文件、文件夹。

这张图是在一个 D:\244 字符 的文件夹里,继续新建文件夹的报错「目标路径太长」。
然后我发现群晖文档《 如果 Windows 文件资源管理器提示文件名过长,我该怎么办? 》讲得很清楚:
「最大可用路径长度为 244 个字符,因为 Windows 文件资源管理器为 8.3 文件名格式预留了 12 个字符。」
其实微软文档《最大路径长度限制》也提到了:「使用 API 创建目录时,指定的路径不能太长以致于无法附加 8.3 文件名(即目录名不能超过 MAX_PATH 减 12 )」。只是不太显眼,容易被忽略。
在 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 个字符的文件、文件夹。
在「群晖文档」中提到:「此限制仅适用于 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 函数生效。
前面测试的文件资源管理器,PowerShell 的 New-Item 、Rename-Item 等命令仍然不完全支持长路径。
New-Item 、Rename-Item 具体调用的是什么函数?这个问题超出我能力范围了。
启用长路径之后,mkdir(New-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 零头的一半。
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 ,并且用「记事本」读写:
而且,到了这个长度,「文件资源管理器」报错是「目录名称无效」:
「启用长路径」之后这个报错也还在。
就到此为止吧,暂时不继续研究了。
终于到了我研究这个问题的初心了!
我发现 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
群晖文档《 Cloud Station Backup 帮助 》:
Cloud Station Backup 默认在以下情况下不会备份文件和文件夹:
对于 Windows:
看了但没用上:
30 年前的技术债引发 win11 离奇 bug ,微软不敢修!
请教一下,windows 系统变量字符过长有什么好的解决方案!
2026-03-21 第一版
2026-03-19 开始写
欢迎关注我的频道: https://t.me/fengwq
1
liuxue 16 小时 51 分钟前 via iPhone
我发现这个问题是因为用户反映在网页中上传文件夹时,文件上传失败了,问题排查了 2 天
|
2
fyq 16 小时 43 分钟前 这才是 V 站该讨论的东西啊
|
3
mgcnrx11 16 小时 21 分钟前
我就问问,node_modules 会因为路径长度不能超过 255 引发的问题,存在吗?普遍吗?
|
5
adoal 15 小时 40 分钟前
你那个 mkdir 的例子,在 cmd 下反而可以成功。
|
6
Mithril 14 小时 28 分钟前
@mgcnrx11 不太普遍,但是有。这种自身嵌套就很长的程序生成文件都可能出问题,包括但不限于 npm 这种包管理,Git/Mercurial 的 checkout ,还有压缩包的解压。
特别是你把.git 或者.hg 打到压缩包里,然后又找了个比较深的路径解压,很容易出问题。 |
8
xaxb 13 小时 0 分钟前
遇到过该问题,Windows 下解压不出来,提示文件名过长,换到 Linux 下解压改名再传出来解决的。
|
9
FarAhead 12 小时 57 分钟前
|
11
codehz 12 小时 27 分钟前 你用 NT API 的话,最大长度就直接 32767 个 utf-16 了(不是传入 nt 路径给 win32 api ,是真实调用 Nt 开头的 api ,手动构造 UNICODE_STRING 对象才可以,这个限制的来源是 UNICODE_STRING 的长度字段 USHORT 决定的()
|
12
DualVectorFoil 12 小时 6 分钟前
|
13
DualVectorFoil 12 小时 5 分钟前
@DualVectorFoil 对不起我是瞎子第一个就是啊😂
|
14
fengwq OP PRO @codehz #11 那不写代码的话,有没有调用 NT API 的方法?我知道调用的 API 不一样,但我不了解 Windows 开发,我问了 AI 是没找到方法。
|
15
Opportunity 11 小时 56 分钟前
@mgcnrx11 pnpm 会用哈希做文件名
![]() |
16
ShineyWang 11 小时 55 分钟前
我们公司项目喜欢取一大串名字,代码文件又会带项目名全名
导致 windows 服务器编译时经常遇到这个问题 后来就缩减了,改简写+单独编译目录 |