File name too long window和linux排查,解决
首先,先说一下遇到问题的背景;我们公司需要上报一些文件,不限制格式;而且对于大于50M的文件pdf,压缩包等必须拆分和重命名;从开发到测试和目前的运行一直没有问题;最近在正常下载和上报时发现了个别文件没有下载下来;通过排查日志发现报下面的错;
原来是文件名太长了,通过查询资料了解到原来操作系统对这些都做了限制;而且每个版本可能都会存在不同的限制;
在 Windows API ((以下段落) 中介绍的一些例外情况)中,路径的最大长度为 MAX_PATH,定义为 260 个字符。 本地路径按以下顺序构建:驱动器号、冒号、反斜杠、用反斜杠分隔的名称组件以及终止 null 字符。 例如,驱动器 D 上的最大路径为“D:\some 256 个字符的路径字符串<NUL>”,其中“<NUL>”表示当前系统代码页的不可见终止 null 字符。 (此处使用的字符 <> 是为了直观明了,不能是有效路径 string 的一部分。)
例如,如果将具有长文件名的 git 存储库克隆到本身具有长名称的文件夹,则可能会达到此限制。
详细资料大家可以查阅:https://learn.microsoft.com/zh-cn/windows/win32/fileio/maximum-file-path-limitation?tabs=registry
操作系统 | 文件名最大长度(字节) | 路径最大长度 |
---|---|---|
Linux | 255 | 4096 |
MAC | 255 | 1024 |
Windows(未开启长文件名) | 255 | 260 |
Windows(开启长文件名) | 255 | 32767 |
上面的图例大家可以参考,具体可能还需要根据自身装的系统进行详细的查询。
详细说明:
1、linux
Linux的 /usr/include/linux/limits.h 中做出了说明
#ifndef _LINUX_LIMITS_H
#define _LINUX_LIMITS_H
#define NAME_MAX 255 /* # chars in a file name */
#define PATH_MAX 4096 /* # chars in a path name including nul */
#endif
这些限制在Linux系统下可以通过修改系统内核修改这个限制。
Linux文件名和目录的长度限制是255个字符(字节,linux中所说的字符是以ascii码来编码的)
2 windows
Windows 通常限定文件名最多包含 260 个字符(一个汉字占用两个字符哦)。但实际的文件名必须少于这一数值,因为完整路径(如 C:\Program Files\filename.txt)都包含在此字符数值中。 windows下完全限定文件名必须少于260个字符,目录名必须小于248个字符。(包含目录文件夹) win7x64位环境: 260个长度是作为总的文件名长度限制。 如果在程序中的话,超出长度的话MoveFile/CopyFile会返回错误,处理失败。
3 mac
文件名最长255字节(包含扩展名),路径最长:1024
既然来了,那就认识下,扫描关注下日后多交流!