Filesystems 各种平台的保留文件名是什么?

Filesystems 各种平台的保留文件名是什么?,filesystems,naming,Filesystems,Naming,我不是问文件名的一般语法规则。我是说那些不知从哪里跳出来咬你的家伙。例如,试图在Windows上命名一个文件“COM”?嗯,对于MSDOS/Windows、NUL、PRN、LPT和CON。如果与扩展名“NUL.TXT”一起使用,它们甚至会导致问题。当您不知道以下情况时,这是一个棘手的Unix问题: 以-或-开头的文件是合法的,但使用起来很麻烦,因为许多命令行工具认为您正在为它们提供选项 其中许多工具都有一个特殊的标记“-”来表示选项的结束: gzip -9vf -- -mydashedfilen

我不是问文件名的一般语法规则。我是说那些不知从哪里跳出来咬你的家伙。例如,试图在Windows上命名一个文件“COM”?

嗯,对于MSDOS/Windows、NUL、PRN、LPT和CON。如果与扩展名“NUL.TXT”一起使用,它们甚至会导致问题。

当您不知道以下情况时,这是一个棘手的Unix问题:

以-或-开头的文件是合法的,但使用起来很麻烦,因为许多命令行工具认为您正在为它们提供选项

其中许多工具都有一个特殊的标记“-”来表示选项的结束:

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