参考:
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 directory
full_command_line := DllCall("GetCommandLine", "str")
if not (A_IsAdmin or RegExMatch(full_command_line, " /restart(?!\S)"))
{
try
{
if A_IsCompiled
Run *RunAs "%A_ScriptFullPath%" /restart
else
Run *RunAs "%A_AhkPath%" /restart "%A_ScriptFullPath%"
}
ExitApp
}
MAX_PATH := 260
; Test of longest path in the script directory
Loop {
MaxChars := MAX_PATH - A_Index
LongPath := A_ScriptDir "\"
NoChars := StrLen(LongPath)
Loop, % MaxChars - NoChars - 4
LongPath .= "x"
LongPath .= ".txt"
FileAppend, , % LongPath
if 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:\ folder
Loop {
MaxChars := MAX_PATH - A_Index
LongPath := "C:\"
NoChars := StrLen(LongPath)
Loop, % MaxChars - NoChars - 4
LongPath .= "x"
LongPath .= ".txt"
FileAppend, , % LongPath
if 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:\ folder
Loop {
MaxChars := MAX_PATH - A_Index
LongPath := "C:\"
NoChars := StrLen(LongPath)
Loop, % MaxChars - NoChars
LongPath .= "x"
FileCreateDir, % LongPath
if 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:\ folder
Loop {
MaxChars := MAX_PATH - A_Index
LongPath := "C:\"
NoChars := StrLen(LongPath)
Loop, % MaxChars - NoChars - 13 ; StrLen("\") + 8 + 1 + 3 (8.3 file) = 13
LongPath .= "x"
LongPath .= "\"
FileCreateDir, % LongPath
Folder := LongPath
LongPath .= "12345678.123"
FileAppend, , % LongPath
if 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, % Folder
ExitApp
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 个字符。
我修改了我的原始帖子以反映上述观察结果。
:: ---------------------------------------------------------------------------------------------------------------------
目录
【参考:】
【大小写敏感】
【同级目录下允许存在同名文件与目录】
【文件名禁止字符】
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 手段添加的禁止字符。
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"
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 字节。
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
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)。
#NoEnv
; Admin priviledges are required to create files and/or folders in the root directory
full_command_line := DllCall("GetCommandLine", "str")
if not (A_IsAdmin or RegExMatch(full_command_line, " /restart(?!\S)"))
{
try
{
if A_IsCompiled
Run *RunAs "%A_ScriptFullPath%" /restart
else
Run *RunAs "%A_AhkPath%" /restart "%A_ScriptFullPath%"
}
ExitApp
}
MAX_PATH := 260
; Test of longest path in the script directory
Loop {
MaxChars := MAX_PATH - A_Index
LongPath := A_ScriptDir "\"
NoChars := StrLen(LongPath)
Loop, % MaxChars - NoChars - 4
LongPath .= "x"
LongPath .= ".txt"
FileAppend, , % LongPath
if 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:\ folder
Loop {
MaxChars := MAX_PATH - A_Index
LongPath := "C:\"
NoChars := StrLen(LongPath)
Loop, % MaxChars - NoChars - 4
LongPath .= "x"
LongPath .= ".txt"
FileAppend, , % LongPath
if 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:\ folder
Loop {
MaxChars := MAX_PATH - A_Index
LongPath := "C:\"
NoChars := StrLen(LongPath)
Loop, % MaxChars - NoChars
LongPath .= "x"
FileCreateDir, % LongPath
if 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:\ folder
Loop {
MaxChars := MAX_PATH - A_Index
LongPath := "C:\"
NoChars := StrLen(LongPath)
Loop, % MaxChars - NoChars - 13 ; StrLen("\") + 8 + 1 + 3 (8.3 file) = 13
LongPath .= "x"
LongPath .= "\"
FileCreateDir, % LongPath
Folder := LongPath
LongPath .= "12345678.123"
FileAppend, , % LongPath
if 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, % Folder
ExitApp
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 个字符。
我修改了我的原始帖子以反映上述观察结果。
:: ---------------------------------------------------------------------------------------------------------------------