window、linux、mac 文件路径禁止字符, 路径长度【全网总结】
参考:
https://9to5answer.com/what-characters-are-forbidden-in-windows-and-linux-directory-names
https://www.codenong.com/1976007/#码农翻译快照#Windows和Linux目录名中禁止使用哪些字符?
https://ispacesoft.com/64457.html#各种系统路径和文件名长度的最大限制
https://learn.microsoft.com/zh-cn/windows/win32/fileio/maximum-file-path-limitation#最大路径长度限制
https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/18e63b13-ba43-4f5f-a5b7-11e871b71f14#8.3文件名规则
https://www.autohotkey.com/boards/viewtopic.php?t=86131#@iPhilip drive letter + :\ + 243 folder name characters + \ + 12 file name characters【大小写敏感】Windows: noLinux/Unix:yesMacOS: yesMacOSX: no【同级目录下允许存在同名文件与目录】Windows: no万事总有例外,如: Windows 11 桌面隐藏两个同名文件 "Desktop.ini"使用其它 Hacker 手段也可能创建同名文件。【文件名禁止字符】这里讲的是正常使用情况下的禁止规则,排除使用其它 Hacker 手段添加的禁止字符。Windows:1.文件路径(包括驱动器号、目录名、文件名)不区分大小写。2.被禁可打印ASCII字符是:\ / : * ? " < > |\ (backslash,可作为路径分隔符,将一个目录名与路径中的另一个目录名称分开)/ (forward slash): (colon - sometimes works, but is actually NTFS Alternate Data Streams,作为驱动器号与目录路径的分隔符)* (asterisk)? (question mark)" (double quote)< (less than)> (greater than)| (vertical bar or pipe)3.不可打印字符如果您的数据来自允许不可打印字符的源,那么还需要检查更多。0-31 (ASCII control characters,控制字符)4.保留文件名(包含小写)AUX, CON, CONIN$, CONOUT$, NUL, PRNCOM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9但加上任意的文件扩展名则符合规则,例如,LPT1.txt。只加一个点号和/或空格可不行,如: CON. 或 CON . 【自测 Win10】 CONIN $,CONOUT $ CONIN(或CONOUT)+空格+$ 是合法文件名。CONIN$, CONOUT$ 也被保留。试图创建则提示是“无效的文件句柄”。"CONIN$" 和 "CONOUT$" 也是保留字。与 "CON" 不同,它们允许以读写方式访问控制台输入和屏幕缓冲区。在 Windows 8 之前,只有基本文件名是保留的。从 Windows 8 开始,底层的控制台 IPC 被重新设计为使用设备驱动程序,因此这两个名称现在被通用地作为 DOS 设备处理,与 "NUL" 等相同。这意味着它们可以用于本地设备路径,例如 "\\.\CONIN$" 和 "\\?\CONOUT$" ,且还意味着 API 假装这些名称在每个现有目录中都 '存在' 。例如,"C:\Temp\CONOUT$" 引用控制台输出。【DOS设备名称】请注意,保留的 DOS 设备名称和文件名以点或空格结尾的规则是在将 DOS 路径转换为本地 NT 路径时由运行时库应用的。如果路径以 "\\?\" 本地设备前缀开头,则跳过这个规范化步骤,除了用 NT 的 "\??\" 设备前缀替换 "\\?\" 。这个前缀指示对象管理器在登录会话和全局 DOS 设备目录中搜索一个符号链接,该符号链接指向一个本地 NT 设备,通常是 "\Device" 目录中的一个设备对象。【LPT1...9】使用 Cygwin,您可以轻松创建 lpt1 和 lpt1.txt 等类似设备名。【不可打印字符】把 TAB 等字符粘贴进 Cygwin Bash, 可以用它在 Windows 下创建含有特殊字符的文件名。ls -l 查看显示为 '$'\t 这其实是一个字符,并非两个字符。5.文件名不能以空格开头或结尾Windows 自动去除开头和结尾的连续空格。6.文件名不能以英文点号结尾- Windows 自动去除结尾的连续点号 ‘.’- 使用句点作为路径中的目录部分来表示当前目录,例如 ".\\temp.txt"- 使用两个连续的句点 (..) 作为路径中的目录 组件 来表示父目录,例如 "..\\temp.txt"因此包括但不止下列文件名均不合法:.........." ...." 这里要去除双引号,只为表示前面有一个空格".... " 这里要去除双引号,只为表示后面有一个空格... . ...7.其他规则DOS中, 不允许使用 - (hyphen, 连字符)FAT、exFAT 格式禁止 ^ "CONIN$", "CONOUT$"8.文件路径长度限制- 不开启长文件名Windows 默认不开启长文件名,系统路径的限制长度是 260,文件名的长度最大不超过 255.在头文件 stdlib.h 中定义#define MAX_PATH 260实际的文件名必须少于 260,因为完整路径(如 C:\Program Files\filename.txt)都包含在此字符数值中。另外末尾要保留一个字节 (GBK) 或两个字节 (UNICODE) 给结束符 (null, 即 \0)。- 开启长文件名Windows 开启长文件名时,系统路径的限制长度是 32767,文件名的长度最大不超过 255.从 Windows 10 version 1607 build 14352 之后,就可以设置启用 enable NTFS long paths 来打破路径最大长度是 260 的限制。开启的方法是:打开注册表,修改[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]"LongPathsEnabled"=dword:00000001- 在命令文件时,windows会截断文件名超出长度的部分。- 在脚本中,文件路径首尾各一个双引号不算在长度内。- 关于一个汉字占用两个字节,可能与 GBK(GB2312等) 和 UNICODE(UTF-8等) 编码有关。 一个中文字符,GBK: 1; UNICODE: 2 个字节。- UNC(Universal Naming Convention),即“通用命名约定”。如果文件路径采用 UNC 规则, 一些前缀不用作路径本身的一部分。如:\\?\UNC\server\share其中“server”是计算机的名称,“share”是共享文件夹的名称。这些前缀不用作路径本身的一部分。它们指示路径应以最少的修改传递到系统,这意味着您不能使用正斜杠来表示路径分隔符,也不能使用句点来表示当前目录,也不能使用双点来表示父目录。由于不能将“\\?\”前缀与相对路径一起使用,因此相对路径始终限制为总共 MAX_PATH(包括 \0) 个字符。- 另外,文件名命名规则有些需要继承 DOS 8.3 命名规则,参考【@iPhilip 实测】 参考文章末尾的讲解。【我的实测 Windows 11 中文简体】文件完整路径最多包含 247 个字符,可能 Windows 8.3 API 有关,下面引自 MSDN 原话:使用 Windows file I/O API 创建目录时,指定的路径不能太长,以至于无法追加 8.3 文件名(即目录名不能超过 MAX_PATH 减 12)。合法最长例子: C:\2441111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111C:\35111111111111111111111111111111111\2081111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111C:\35111111111111111111111111111111111\204111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111.txtC:\31中文11111111111111111111111111111\204111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111.txtC:\31中文11111111111111111111111111111\20611111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111.txt注:上面文件完整路径是 3+33+1+206 个字符+4=247, 说明一个中文文字只占一个字符。把最长命名的文件移动到比当前目录长度更长的目录路径中,不会报错,不会修改文件名。这时再读取这个文件时会出错,但可使用短文件名路径访问,如:type "C:\244111~1\111111~1"Linux/Unix:1.被禁可打印ASCII字符是/ (forward slash)注: Linux/Unix文件名具有控制字符是合法的,对用户来说,处理这些文件可能是一场噩梦。。最好文件名中不要包含 : ? @ # $&()|; ‘’“”<>等字符,另外 空格符,制表符和退格符也不建议使用。避免使用 + - 和. 作为文件名的第一个字符(Linux下以.开头的文件是隐藏文件)。2.不可打印字符\0 (NULL byte)3.文件路径长度限制limits.h 头文件里面有针对 NAME 和 PATH 的最大长度限制:#define NAME_MAX 255 /* # chars in a file name */#define PATH_MAX 4096 /* # chars in a path name including nul */完整路径: 4096 字节; 文件名: 255 字节。MacOS HFS+:1.被禁可打印ASCII字符是:: (colon 英文冒号被禁, 中文冒号:可以)2.其他规则. (dot 英文点号不能放在文件名开头, 中文句号‘。’可以)3.文件路径长度限制syslimits.h 头文件里面有针对 NAME 和 PATH 的最大长度限制:#define NAME_MAX 255 /* # max bytes in a file name */#define PATH_MAX 1024 /* # max bytes in pathname */完整路径: 1024 字节; 文件名: 255 字节。:: ---------------------------------------------------------------------------------------------------------------------https://www.autohotkey.com/boards/viewtopic.php?t=86131
https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/18e63b13-ba43-4f5f-a5b7-11e871b71f14【@iPhilip 实测】I did some tests with the script below and I can make the following observations:
我用下面的脚本做了一些测试,我可以做出以下观察:The maximum number of characters in a path is 259 (MAX_PATH - 1).
路径中的最大字符数为 259 (MAX_PATH - 1)。The maximum number of characters in a file name is 255, e.g. drive letter + :\ + 255 file name characters.
文件名中的最大字符数为 255,例如驱动器号 + :\ + 255 个文件名字符。The maximum number of characters in a folder name is 244, e.g. drive letter + :\ + 244 folder name characters.
文件夹名称中的最大字符数为 244,例如驱动器号 + :\ + 244 个文件夹名称字符。When combined with a backlash and a file name the maximum number of characters in a folder name is 243, e.g. drive letter + :\ + 243 folder name characters + \ + 12 file name characters.
The 12 characters represent the number of characters in an 8.3 file name. This is consistent with the following statement from the Maximum Path Length Limitation page:
当与反斜杠和文件名结合使用时,文件夹名称中的最大字符数为 243,例如驱动器号 + :\ + 243 个文件夹名称字符 + \ + 12 个文件名字符。
这 12 个字符表示 8.3 文件名中的字符数。 8 个基本文件名字符 + . + 最多 3 个扩展名字符。The base filename MUST be 1-8 characters in length and MUST NOT contain a "." period character.
基本文件名的长度必须为 1-8 个字符,并且不得包含“.”句点字符。The filename extension, if present, MUST be 1-3 characters in length and MUST NOT contain a "." period character.
文件扩展名(如果存在)长度必须为 1-3 个字符,并且不得包含“.”句点字符。这与“最大路径长度限制”页中的以下语句一致:When using an API to create a directory, the specified path cannot be so long that you cannot append an 8.3 file name (that is, the directory name cannot exceed MAX_PATH minus 12).
使用 API 创建目录时,指定的路径不能太长,以至于无法追加 8.3 文件名(即目录名不能超过 MAX_PATH 减 12)。Here is the script: 这是脚本:#NoEnv; Admin priviledges are required to create files and/or folders in the root directoryfull_command_line := DllCall("GetCommandLine", "str")if not (A_IsAdmin or RegExMatch(full_command_line, " /restart(?!\S)"))
{try{if A_IsCompiledRun *RunAs "%A_ScriptFullPath%" /restartelseRun *RunAs "%A_AhkPath%" /restart "%A_ScriptFullPath%"}ExitApp
}MAX_PATH := 260; Test of longest path in the script directoryLoop {MaxChars := MAX_PATH - A_IndexLongPath := A_ScriptDir "\"NoChars := StrLen(LongPath)Loop, % MaxChars - NoChars - 4LongPath .= "x"LongPath .= ".txt"FileAppend, , % LongPathif FileExist(LongPath)break
}
MsgBox % "The file path has " StrLen(LongPath) " characters.`nThe file name has " StrLen(LongPath) - NoChars " characters.`nThe first 25 characters are: " SubStr(LongPath, 1, 25) "`nThe last 25 characters are: " SubStr(LongPath, -24) "`n`nClick OK to delete it."
FileDelete, % LongPath; Test of the longest filename in the C:\ folderLoop {MaxChars := MAX_PATH - A_IndexLongPath := "C:\"NoChars := StrLen(LongPath)Loop, % MaxChars - NoChars - 4LongPath .= "x"LongPath .= ".txt"FileAppend, , % LongPathif FileExist(LongPath)break
}
MsgBox % "The file path has " StrLen(LongPath) " characters.`nThe file name has " StrLen(LongPath) - NoChars " characters.`nThe first 25 characters are: " SubStr(LongPath, 1, 25) "`nThe last 25 characters are: " SubStr(LongPath, -24) "`n`nClick OK to delete it."
FileDelete, % LongPath; Test of the longest folder in the C:\ folderLoop {MaxChars := MAX_PATH - A_IndexLongPath := "C:\"NoChars := StrLen(LongPath)Loop, % MaxChars - NoCharsLongPath .= "x"FileCreateDir, % LongPathif FileExist(LongPath)break
}
MsgBox % "The folder path has " StrLen(LongPath) " characters.`nThe folder name has " StrLen(LongPath) - NoChars " characters.`nThe first 25 characters are: " SubStr(LongPath, 1, 25) "`nThe last 25 characters are: " SubStr(LongPath, -24) "`n`nClick OK to delete it."
FileRemoveDir, % LongPath; Test of the longest folder + 8.3 file name in the C:\ folderLoop {MaxChars := MAX_PATH - A_IndexLongPath := "C:\"NoChars := StrLen(LongPath)Loop, % MaxChars - NoChars - 13 ; StrLen("\") + 8 + 1 + 3 (8.3 file) = 13LongPath .= "x"LongPath .= "\"FileCreateDir, % LongPathFolder := LongPathLongPath .= "12345678.123"FileAppend, , % LongPathif FileExist(LongPath)break
}
MsgBox % "The folder path has " StrLen(LongPath) " characters.`nThe folder name has " StrLen(Folder) - NoChars - 1 " characters.`nThe first 25 characters are: " SubStr(LongPath, 1, 25) "`nThe last 25 characters are: " SubStr(LongPath, -24) "`n`nClick OK to delete it."
FileDelete, % LongPath
FileRemoveDir, % FolderExitAppThus, the statement in the Long Paths section of the documentation is partially correct in that a single file name,
but not a folder name, has a maximum length of 255 characters.
I modified my original post to reflect the above observations.
因此,文档的“长路径”部分中的语句部分正确,因为单个文件名(而不是文件夹名称)的最大长度为 255 个字符。
我修改了我的原始帖子以反映上述观察结果。:: ---------------------------------------------------------------------------------------------------------------------
目录
【参考:】
【大小写敏感】
【同级目录下允许存在同名文件与目录】
【文件名禁止字符】
Windows:
Linux/Unix:
MacOS HFS+:
【@iPhilip 实测】
Here is the script: 这是脚本:
【参考:】
https://9to5answer.com/what-characters-are-forbidden-in-windows-and-linux-directory-names
https://www.codenong.com/1976007/#码农翻译快照#Windows和Linux目录名中禁止使用哪些字符?
https://ispacesoft.com/64457.html#各种系统路径和文件名长度的最大限制
https://learn.microsoft.com/zh-cn/windows/win32/fileio/maximum-file-path-limitation#最大路径长度限制
https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/18e63b13-ba43-4f5f-a5b7-11e871b71f14#8.3文件名规则
https://www.autohotkey.com/boards/viewtopic.php?t=86131#@iPhilip drive letter + :\ + 243 folder name characters + \ + 12 file name characters
【大小写敏感】
Windows: no
Linux/Unix:yes
MacOS: yes
MacOSX: no
【同级目录下允许存在同名文件与目录】
Windows: no
万事总有例外,如: Windows 11 桌面隐藏两个同名文件 "Desktop.ini"
使用其它 Hacker 手段也可能创建同名文件。
【文件名禁止字符】
这里讲的是正常使用情况下的禁止规则,排除使用其它 Hacker 手段添加的禁止字符。
Windows:
1.文件路径(包括驱动器号、目录名、文件名)不区分大小写。
2.被禁可打印ASCII字符是:
\ / : * ? " < > |
\ (backslash,可作为路径分隔符,将一个目录名与路径中的另一个目录名称分开)
/ (forward slash)
: (colon - sometimes works, but is actually NTFS Alternate Data Streams,作为驱动器号与目录路径的分隔符)
* (asterisk)
? (question mark)
" (double quote)
< (less than)
> (greater than)
| (vertical bar or pipe)
3.不可打印字符
如果您的数据来自允许不可打印字符的源,那么还需要检查更多。
0-31 (ASCII control characters,控制字符)
4.保留文件名(包含小写)
AUX, CON, CONIN$, CONOUT$, NUL, PRN
COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9
LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9
但加上任意的文件扩展名则符合规则,例如,LPT1.txt。
只加一个点号和/或空格可不行,如: CON. 或 CON .
【自测 Win10】
CONIN $,CONOUT $ CONIN(或CONOUT)+空格+$ 是合法文件名。
CONIN$, CONOUT$ 也被保留。试图创建则提示是“无效的文件句柄”。
"CONIN$" 和 "CONOUT$" 也是保留字。
与 "CON" 不同,它们允许以读写方式访问控制台输入和屏幕缓冲区。
在 Windows 8 之前,只有基本文件名是保留的。
从 Windows 8 开始,底层的控制台 IPC 被重新设计为使用设备驱动程序,
因此这两个名称现在被通用地作为 DOS 设备处理,与 "NUL" 等相同。
这意味着它们可以用于本地设备路径,例如 "\\.\CONIN$" 和 "\\?\CONOUT$" ,
且还意味着 API 假装这些名称在每个现有目录中都 '存在' 。例如,"C:\Temp\CONOUT$" 引用控制台输出。
【DOS设备名称】
请注意,保留的 DOS 设备名称和文件名以点或空格结尾的规则是在将 DOS 路径转换为本地 NT 路径时由运行时库应用的。
如果路径以 "\\?\" 本地设备前缀开头,则跳过这个规范化步骤,除了用 NT 的 "\??\" 设备前缀替换 "\\?\" 。
这个前缀指示对象管理器在登录会话和全局 DOS 设备目录中搜索一个符号链接,
该符号链接指向一个本地 NT 设备,通常是 "\Device" 目录中的一个设备对象。
【LPT1...9】
使用 Cygwin,您可以轻松创建 lpt1 和 lpt1.txt 等类似设备名。
【不可打印字符】
把 TAB 等字符粘贴进 Cygwin Bash, 可以用它在 Windows 下创建含有特殊字符的文件名。
ls -l 查看显示为 '$'\t 这其实是一个字符,并非两个字符。
5.文件名不能以空格开头或结尾
Windows 自动去除开头和结尾的连续空格。
6.文件名不能以英文点号结尾
- Windows 自动去除结尾的连续点号 ‘.’
- 使用句点作为路径中的目录部分来表示当前目录,例如 ".\\temp.txt"
- 使用两个连续的句点 (..) 作为路径中的目录 组件 来表示父目录,例如 "..\\temp.txt"
因此包括但不止下列文件名均不合法:
.
..
...
....
" ...." 这里要去除双引号,只为表示前面有一个空格
".... " 这里要去除双引号,只为表示后面有一个空格
... . ...
7.其他规则
DOS中, 不允许使用 - (hyphen, 连字符)
FAT、exFAT 格式禁止 ^ "CONIN$", "CONOUT$"
8.文件路径长度限制
- 不开启长文件名
Windows 默认不开启长文件名,系统路径的限制长度是 260,文件名的长度最大不超过 255.
在头文件 stdlib.h 中定义
#define MAX_PATH 260
实际的文件名必须少于 260,因为完整路径(如 C:\Program Files\filename.txt)都包含在此字符数值中。
另外末尾要保留一个字节 (GBK) 或两个字节 (UNICODE) 给结束符 (null, 即 \0)。
- 开启长文件名
Windows 开启长文件名时,系统路径的限制长度是 32767,文件名的长度最大不超过 255.
从 Windows 10 version 1607 build 14352 之后,就可以设置启用 enable NTFS long paths 来打破路径最大长度是 260 的限制。
开启的方法是:打开注册表,修改
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"LongPathsEnabled"=dword:00000001
- 在命令文件时,windows会截断文件名超出长度的部分。
- 在脚本中,文件路径首尾各一个双引号不算在长度内。
- 关于一个汉字占用两个字节,可能与 GBK(GB2312等) 和 UNICODE(UTF-8等) 编码有关。 一个中文字符,GBK: 1; UNICODE: 2 个字节。
- UNC(Universal Naming Convention),即“通用命名约定”。
如果文件路径采用 UNC 规则, 一些前缀不用作路径本身的一部分。如:
\\?\UNC\server\share
其中“server”是计算机的名称,“share”是共享文件夹的名称。这些前缀不用作路径本身的一部分。它们指示路径应以最少的修改传递到系统,
这意味着您不能使用正斜杠来表示路径分隔符,也不能使用句点来表示当前目录,也不能使用双点来表示父目录。
由于不能将“\\?\”前缀与相对路径一起使用,因此相对路径始终限制为总共 MAX_PATH(包括 \0) 个字符。
- 另外,文件名命名规则有些需要继承 DOS 8.3 命名规则,参考
【@iPhilip 实测】 参考文章末尾的讲解。
【我的实测 Windows 11 中文简体】
文件完整路径最多包含 247 个字符,可能 Windows 8.3 API 有关,下面引自 MSDN 原话:
使用 Windows file I/O API 创建目录时,指定的路径不能太长,以至于无法追加 8.3 文件名(即目录名不能超过 MAX_PATH 减 12)。
合法最长例子:
C:\2441111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
C:\35111111111111111111111111111111111\2081111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
C:\35111111111111111111111111111111111\204111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111.txt
C:\31中文11111111111111111111111111111\204111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111.txt
C:\31中文11111111111111111111111111111\20611111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111.txt
注:上面文件完整路径是 3+33+1+206 个字符+4=247, 说明一个中文文字只占一个字符。
把最长命名的文件移动到比当前目录长度更长的目录路径中,不会报错,不会修改文件名。
这时再读取这个文件时会出错,但可使用短文件名路径访问,如:
type "C:\244111~1\111111~1"
Linux/Unix:
1.被禁可打印ASCII字符是
/ (forward slash)
注: Linux/Unix文件名具有控制字符是合法的,对用户来说,处理这些文件可能是一场噩梦。。
最好文件名中不要包含 : ? @ # $&()|; ‘’“”<>等字符,另外 空格符,制表符和退格符也不建议使用。
避免使用 + - 和. 作为文件名的第一个字符(Linux下以.开头的文件是隐藏文件)。
2.不可打印字符
\0 (NULL byte)
3.文件路径长度限制
limits.h 头文件里面有针对 NAME 和 PATH 的最大长度限制:
#define NAME_MAX 255 /* # chars in a file name */
#define PATH_MAX 4096 /* # chars in a path name including nul */
完整路径: 4096 字节; 文件名: 255 字节。
MacOS HFS+:
1.被禁可打印ASCII字符是:
: (colon 英文冒号被禁, 中文冒号:可以)
2.其他规则
. (dot 英文点号不能放在文件名开头, 中文句号‘。’可以)
3.文件路径长度限制
syslimits.h 头文件里面有针对 NAME 和 PATH 的最大长度限制:
#define NAME_MAX 255 /* # max bytes in a file name */
#define PATH_MAX 1024 /* # max bytes in pathname */
完整路径: 1024 字节; 文件名: 255 字节。
:: ---------------------------------------------------------------------------------------------------------------------
https://www.autohotkey.com/boards/viewtopic.php?t=86131
https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/18e63b13-ba43-4f5f-a5b7-11e871b71f14
【@iPhilip 实测】
I did some tests with the script below and I can make the following observations:
我用下面的脚本做了一些测试,我可以做出以下观察:
The maximum number of characters in a path is 259 (MAX_PATH - 1).
路径中的最大字符数为 259 (MAX_PATH - 1)。
The maximum number of characters in a file name is 255, e.g. drive letter + :\ + 255 file name characters.
文件名中的最大字符数为 255,例如驱动器号 + :\ + 255 个文件名字符。
The maximum number of characters in a folder name is 244, e.g. drive letter + :\ + 244 folder name characters.
文件夹名称中的最大字符数为 244,例如驱动器号 + :\ + 244 个文件夹名称字符。
When combined with a backlash and a file name the maximum number of characters in a folder name is 243, e.g. drive letter + :\ + 243 folder name characters + \ + 12 file name characters.
The 12 characters represent the number of characters in an 8.3 file name. This is consistent with the following statement from the Maximum Path Length Limitation page:
当与反斜杠和文件名结合使用时,文件夹名称中的最大字符数为 243,例如驱动器号 + :\ + 243 个文件夹名称字符 + \ + 12 个文件名字符。
这 12 个字符表示 8.3 文件名中的字符数。 8 个基本文件名字符 + . + 最多 3 个扩展名字符。
The base filename MUST be 1-8 characters in length and MUST NOT contain a "." period character.
基本文件名的长度必须为 1-8 个字符,并且不得包含“.”句点字符。
The filename extension, if present, MUST be 1-3 characters in length and MUST NOT contain a "." period character.
文件扩展名(如果存在)长度必须为 1-3 个字符,并且不得包含“.”句点字符。
这与“最大路径长度限制”页中的以下语句一致:
When using an API to create a directory, the specified path cannot be so long that you cannot append an 8.3 file name (that is, the directory name cannot exceed MAX_PATH minus 12).
使用 API 创建目录时,指定的路径不能太长,以至于无法追加 8.3 文件名(即目录名不能超过 MAX_PATH 减 12)。
Here is the script: 这是脚本:
#NoEnv; Admin priviledges are required to create files and/or folders in the root directoryfull_command_line := DllCall("GetCommandLine", "str")if not (A_IsAdmin or RegExMatch(full_command_line, " /restart(?!\S)"))
{try{if A_IsCompiledRun *RunAs "%A_ScriptFullPath%" /restartelseRun *RunAs "%A_AhkPath%" /restart "%A_ScriptFullPath%"}ExitApp
}MAX_PATH := 260; Test of longest path in the script directoryLoop {MaxChars := MAX_PATH - A_IndexLongPath := A_ScriptDir "\"NoChars := StrLen(LongPath)Loop, % MaxChars - NoChars - 4LongPath .= "x"LongPath .= ".txt"FileAppend, , % LongPathif FileExist(LongPath)break
}
MsgBox % "The file path has " StrLen(LongPath) " characters.`nThe file name has " StrLen(LongPath) - NoChars " characters.`nThe first 25 characters are: " SubStr(LongPath, 1, 25) "`nThe last 25 characters are: " SubStr(LongPath, -24) "`n`nClick OK to delete it."
FileDelete, % LongPath; Test of the longest filename in the C:\ folderLoop {MaxChars := MAX_PATH - A_IndexLongPath := "C:\"NoChars := StrLen(LongPath)Loop, % MaxChars - NoChars - 4LongPath .= "x"LongPath .= ".txt"FileAppend, , % LongPathif FileExist(LongPath)break
}
MsgBox % "The file path has " StrLen(LongPath) " characters.`nThe file name has " StrLen(LongPath) - NoChars " characters.`nThe first 25 characters are: " SubStr(LongPath, 1, 25) "`nThe last 25 characters are: " SubStr(LongPath, -24) "`n`nClick OK to delete it."
FileDelete, % LongPath; Test of the longest folder in the C:\ folderLoop {MaxChars := MAX_PATH - A_IndexLongPath := "C:\"NoChars := StrLen(LongPath)Loop, % MaxChars - NoCharsLongPath .= "x"FileCreateDir, % LongPathif FileExist(LongPath)break
}
MsgBox % "The folder path has " StrLen(LongPath) " characters.`nThe folder name has " StrLen(LongPath) - NoChars " characters.`nThe first 25 characters are: " SubStr(LongPath, 1, 25) "`nThe last 25 characters are: " SubStr(LongPath, -24) "`n`nClick OK to delete it."
FileRemoveDir, % LongPath; Test of the longest folder + 8.3 file name in the C:\ folderLoop {MaxChars := MAX_PATH - A_IndexLongPath := "C:\"NoChars := StrLen(LongPath)Loop, % MaxChars - NoChars - 13 ; StrLen("\") + 8 + 1 + 3 (8.3 file) = 13LongPath .= "x"LongPath .= "\"FileCreateDir, % LongPathFolder := LongPathLongPath .= "12345678.123"FileAppend, , % LongPathif FileExist(LongPath)break
}
MsgBox % "The folder path has " StrLen(LongPath) " characters.`nThe folder name has " StrLen(Folder) - NoChars - 1 " characters.`nThe first 25 characters are: " SubStr(LongPath, 1, 25) "`nThe last 25 characters are: " SubStr(LongPath, -24) "`n`nClick OK to delete it."
FileDelete, % LongPath
FileRemoveDir, % FolderExitApp
Thus, the statement in the Long Paths section of the documentation is partially correct in that a single file name,
but not a folder name, has a maximum length of 255 characters.
I modified my original post to reflect the above observations.
因此,文档的“长路径”部分中的语句部分正确,因为单个文件名(而不是文件夹名称)的最大长度为 255 个字符。
我修改了我的原始帖子以反映上述观察结果。
:: ---------------------------------------------------------------------------------------------------------------------
window、linux、mac 文件路径禁止字符, 路径长度【全网总结】相关推荐
- 简单介绍Linux进程文件路径的获取方法
Linux进程文件路径在哪里才能找得到呢,有时会让Linux系统管理员费些心思,这里小编说一个简单的案例,相信会让不少管理员有所收获,帮助轻松获得想要的Linux进程文件路径,完成指定任务. 进入/p ...
- linux history文件路径,Linux、Unix常用命令(文件和目录相关)
mkdir dirname 建立子目录. 注意:用户不能在一个不存在的目录中建立子目录. mkdir data 在当前目录下建立子目录 data mkdir /usr/data 在/usr/目录下建立 ...
- linux防火墙文件路径,防火墙问题 Linux系统 /etc/sysconfig/路径下无iptables文件
虚拟机新装了一个CentOs7,然后做防火墙配置的时候找不到iptables文件,解决方法如下: 因为默认使用的是firewall作为防火墙,把他停掉装个iptable systemctl stop ...
- python 中文件路径到底怎么写 + 获取mac文件路径快捷键!!
目录 1 MAC路径与Windows路径问题 2 绝对路径和相对路径概念 3 macOS获取文件绝对路径的快捷键为: 1 MAC路径与Windows路径问题 几乎所有计算机在文件夹名称间使用的都是正斜 ...
- linux 文件名的长度不得超过,linux对文件路径和文件名长度的限制
linux对文件夹以及文件名的长度做了限制,以ubuntu为例,描述文件路径为:/usr/include/linux/limits.h #ifndef _LINUX_LIMITS_H #define ...
- docker部署服务,本地文件路径正常,linux服务器文件路径找不到的小坑
还是想每天坚持写点什么,也是菜的出奇,只能写一些很表层的东西.今天就记录一下工作中遇到docker部署到linux服务器的一个小坑. 项目中有个预览功能,要求返回给前台base64的图片,但是ftp上 ...
- linux 防火墙文件路径,linux防火墙设置
手机评站网今天精心准备的是<linux防火墙设置>,下面是详解! linux如何关闭防火墙 一.Linux下开启/关闭防火墙命令 1) 永久性生效,重启后不会复原 开启: chkconfi ...
- Python读取grib方法总结(window/Linux/Mac)
grib数据是以另一种带压缩功能的自描述文件,和netcdf相比,它没有什么额外的优点,但有诸多使用上的不便.grib使用不便的原因有两个: 该数据的标准定义严格且狭窄,仅有少数部门(或单位.或应用场 ...
- Linux查看文件路径
Linux下有两个命令可以查看命令或者文件所在的位置 1.which which 用来查看当前要执行的命令所在的路径 which - shows the full path of (shell) co ...
最新文章
- java的移植性_详细介绍JAVA的可移植性
- python学习 第七篇 sql优化
- 项目管理工具到底应该为谁服务?
- wsdd文件是怎么生成的_Axis WSDD文件参考文档
- 转:[大数据竞赛]协同过滤在这个问题上是否work
- c语言中oxb0常量是什么意思,C语言练习库V1.0
- Java 查询Word是否存在关键字,并保留word路径到txt
- 舆情分析系统技术解决方案及作用
- js增量更新算法研究
- Smart3D飞控地方坐标系
- 生容易,活容易,生活不容易!
- 华为新版Datacom认证介绍
- VLDB论文解读:阿里云超大规模实时分析型数据库AnalyticDB
- 2021年起重机械指挥考试题及起重机械指挥模拟考试
- 数电实验(一)利用与非门设计四舍五入判别电路
- H3C 防火墙混合实验 新华三杯拆解
- [Geek Challenge 2022] crypto部分
- 手机即时通服务器地址修改,手机即时通服务器地址修改
- 采购注意,公司事业部质量成本分析案例
- 跳槽——找马时,我被驴发现了 1