Filesystems 各种平台的保留文件名是什么?
我不是问文件名的一般语法规则。我是说那些不知从哪里跳出来咬你的家伙。例如,试图在Windows上命名一个文件“COM”?嗯,对于MSDOS/Windows、NUL、PRN、LPT和CON。如果与扩展名“NUL.TXT”一起使用,它们甚至会导致问题。当您不知道以下情况时,这是一个棘手的Unix问题: 以-或-开头的文件是合法的,但使用起来很麻烦,因为许多命令行工具认为您正在为它们提供选项 其中许多工具都有一个特殊的标记“-”来表示选项的结束:Filesystems 各种平台的保留文件名是什么?,filesystems,naming,Filesystems,Naming,我不是问文件名的一般语法规则。我是说那些不知从哪里跳出来咬你的家伙。例如,试图在Windows上命名一个文件“COM”?嗯,对于MSDOS/Windows、NUL、PRN、LPT和CON。如果与扩展名“NUL.TXT”一起使用,它们甚至会导致问题。当您不知道以下情况时,这是一个棘手的Unix问题: 以-或-开头的文件是合法的,但使用起来很麻烦,因为许多命令行工具认为您正在为它们提供选项 其中许多工具都有一个特殊的标记“-”来表示选项的结束: gzip -9vf -- -mydashedfilen
gzip -9vf -- -mydashedfilename
除非您接触的是特殊目录,否则Linux上唯一的非法名称是“
”和“。
”。任何其他名称都是可能的,尽管从shell访问其中一些名称需要使用转义序列
编辑:正如Vinko Vrsalovic所说,以“-
”和“-
”开头的文件是shell带来的麻烦,因为这些字符序列是由应用程序而不是shell解释的。来自:
在使用NTFS的Windows上,下列字符作为文件或文件夹名无效:/
?
:
*
”
以及可以用Ctrl键键入的任何字符
除上述非法字符外,在使用FAT文件系统的Windows操作系统下也不允许使用插入符号
在Windows下,使用FAT文件系统的文件和文件夹名称最长可达255个字符
在Windows下,使用NTFS文件系统的文件和文件夹名称最长可达256个字符
在窗口下,两种系统下的完整路径长度均为260个字符
除这些字符外,以下约定也是非法的:
- 在名称末尾放置空格
- 在名称末尾加上句号
Windows下还保留了以下文件名:
aux
com1
com2
com9
lpt1
lpt2
lpt9
con
nul
prn
Windows上合法和非法文件名的完整描述:boost::filesystem有很多好信息。正如其他人所说,像COM1这样的设备名在Windows下不可能作为文件名,因为它们是保留设备
但是,有一种转义方法可以创建和访问具有这些保留名称的文件,例如,此命令将ver
命令的输出重定向到名为COM1的文件中:
ver > "\\?\C:\Users\username\COM1"
现在您将拥有一个名为COM1的文件,99%的程序将无法打开该文件,如果您尝试访问该文件,该文件可能会冻结
这就解释了“文件名称空间“是的。基本上,它告诉Windows不要对文本进行任何字符串处理,而是直接将其传递到文件系统。此技巧也可用于处理长度超过260个字符的路径。aux也是Windows中不允许使用的文件名,根据文章Adam提到的内容,我认为该文章的合法性值得怀疑,因为它指出在Mac OS X上,“文件和文件夹名不允许以点开头”。”,这绝对是错误的。这不仅仅是你在Windows下保留的文件名,还有那些设备名后面跟任何扩展名,例如COM5.foo
和COM5.bar
都是非法的。根据我的Windows,com0和lpt0也是不允许的,今天我陷入了这种胡言乱语。不知道为什么这些文件名是非法的,如果你给它们添加扩展名>:(我认为像LINK.EXE这样的程序(记得吗?)会接受一个基本文件名,然后生成三个不同扩展名的文件。然后你可以只键入“nul”或“prn”,并且程序可以盲目地添加扩展名,事情仍然可以进行。如果是这样,如何创建包含正斜杠的文件名?是的,/
在任何文件系统的文件名中都无效type@Basic.NT内核的对象管理器本质上是一个虚拟文件系统,只有一个不允许的字符:backslash。因为它使用计数字符串(Pascal/Rust样式字符串),所以即使NUL
在NT对象管理器路径中也是有效的。@ssokolow True,但是,没有允许访问创建这些路径的用户空间工具,因此无法实际使用它们,从而不会破坏一切(包括资源管理器).回到学校的时候,我们用API在XP上重命名文件夹并附加回车符。用于严重破坏资源管理器。@Basic原始问题没有指定该问题是否与命令行使用、API使用等有关。它只是询问gotchas…以及具有支持NUL
和的VFS API/
在路径组件中,可以通过ported/portable libraries/utilities访问。尝试突破260个字符的Win32路径长度限制并获得更多类似Linux的自由对我来说无疑是一个潜在的难题。我再次尝试删除创建的文件,但del在命令行中冻结…编辑:我无法通过h任务管理器或进程黑客…这是怎么回事?对我来说很好。你不能del COM1
,因为这当然会尝试访问串行端口而不是文件,并导致进程锁定,等待串行端口本身的响应(这正是为什么像这样的文件名一开始就被保留和不可用的原因。)如果您在我的回答中使用了转义方法来创建文件,那么您也必须使用该方法来删除它:del“\\?\C:\Users\username\C