Windows 路径报错实测:卡住我的不是 260 字符,是文件名 255

举报
yd_232353574 发表于 2026/10/31 07:38:09 2026/10/31
【摘要】

这次报错的真实原因,和你想的不一样

同事发来一张截图,说目录复制到一半失败了,报的是 OSError: [Errno 22] Invalid argument。第一反应当然是路径太长——那个目录确实深,而且他自己念叨了一句「Windows 不是有 260 字符限制吗」。

我先按老办法查了一遍:路径总长 552 字符,文件名只有 9 个字符。260 那条限制在这台机器上根本没生效,文件正常写进去了。

真正卡住的是别的东西。

把两个限制分开测,才看清边界

之前一直把「Windows 路径限制」当成一件事,其实是两件独立的事,而且只有一件是真的。

先说结论:

  • 路径总长:这台机器上 552 字符正常工作,没有碰到任何限制
  • 单个文件名:254 字符就失败,报 Errno 22

第二个才是真正的墙。我把文件名长度从 100 一路加到 300,每个档位都试:

  • 100 字符、200 字符、250 字符(连 .txt 后缀共 254)都正常
  • 254 字符(连后缀共 258)报 OSError: [Errno 22] Invalid argument
  • 300 字符同样报错

失败点在 255 字符这条线上,和路径总长一点关系都没有。

加 \\?\ 前缀也救不回来

老经验是给路径加 \\?\ 前缀就能绕开限制。我照着试了一遍,对超长文件名的场景无效:

  • plain OSError
  • prefixed OSError: [Errno 22] Invalid argument: '\\\\?\\C:...

前缀能解决的是路径总长,解决不了单个文件名超长。

同理,目录名也不能超过 255。我试着建一个 260 字符的目录名,报的是 WinError 123(文件名、目录名或卷标语法不正确),跟 Errno 22 不是一回事。

为什么这台机器上 260 那条不生效

Python 3.6 起在 Windows 上默认启用长路径支持,文档里写明「在最新版本的 Windows 中,此限制可放宽到大约 32,000 个字符」,但前提是系统打开了组策略或注册表项 LongPathsEnabled。

我没有直接读注册表确认(这台机器上 reg.exe 被安全策略拦了),改用行为反推:写一个 552 字符的路径,open() 正常写入并读回内容;再用 cmd.exe 的 type 命令读同一个文件,同样正常返回。

cmd.exe 是完全不走 Python 的独立进程,它能读通说明限制确实已经解除,不只是 Python 在做转换。

顺带一个对照:显式加 \\?\ 前缀交给 cmd.exe 也一样能读。而不加前缀的 cmd.exe copy 会输出 GBK 编码的中文,Python 侧按 UTF-8 解码会看到乱码,那是编码问题,不是路径问题。

那为什么还会有 260 这个说法

因为它描述的是历史行为。老的 Win32 API 在路径总长超过 260 时确实会失败,现在这个限制有两道闸:

  • 路径总长:默认 260,打开长路径支持后可以到 32,000 字符左右
  • 单个文件名或目录名:255 字符,系统层面就没有放宽的开关

所以「遇到文件名太长就想着去改注册表」这个思路,对第一种情况有效,对第二种完全无效——改完该报错还是报错。

实际怎么绕

短文件名是最省事的办法。真要保留长名字,就把中间那段换成哈希:

  • 原始名 20261030_年度归档方案_v3.2_终稿_审批版.docx 这类,保留前缀和后缀名,中间替换成 8 位哈希
  • 目录同理,别让用户看到的名字承担唯一标识
  • 真需要在数据库或接口里保留完整原名,另存一份到字段里,文件名只做寻址

如果必须让第三方程序读这个文件,注意它可能没有长路径支持(Python、cmd 都实测通过了,但老旧工具不敢保证)。这时就得替对方把文件挪到短路径下,而不是指望对方自己处理。

一句话

路径总长和文件名长度是两个不同的限制,实测下来这台机器上前者已经放宽到 552 字符无碍,后者卡在 255 字符且加前缀无效。遇到 Errno 22 先量文件名长度,比盯着路径总长有效。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。