命名文件、路径和命名空间
命名文件、路径和命名空间 - Win32 apps | Microsoft Docs
https://docs.microsoft.com/zh-cn/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN#maxpath
Windows 支持的所有文件系统都使用文件和目录的概念来访问磁盘或设备上存储的数据。 使用用于文件和设备 i/o 的 Windows Api 的 windows 开发人员应了解各种规则、约定和文件和目录名称的限制。
使用文件 i/o Api 可从磁盘、设备和网络共享访问数据。 文件和目录以及命名空间是路径概念的一部分,它是在其中获取数据的字符串表示形式,无论是从磁盘还是设备还是特定操作的网络连接。
某些文件系统(如 NTFS)支持链接的文件和目录,这些文件和目录也遵循文件命名约定和规则,就像常规文件或目录一样。 有关其他信息,请参阅 硬链接和联接 以及重新 分析点和文件操作。
有关其他信息,请参阅以下子节:
- 文件和目录名称
- 路径
- 命名空间
- 相关主题
若要了解如何配置 Windows 10 以支持长文件路径,请参阅 最大路径长度限制。
文件和目录名称
对于单个文件,所有文件系统都遵循相同的常规命名约定:基本文件名和可选扩展名(用句点分隔)。 但是,每个文件系统(如 NTFS、CDFS、exFAT、UDF、FAT 和 FAT32)都可以具有特定的、不同的规则,这些规则与目录或文件的路径中的单个组件的构造有关。 请注意, 目录 只是一个文件,该文件具有将其指定为目录的特殊属性,但必须遵循与常规文件相同的所有命名规则。 因为术语 目录 只是指文件系统所涉及的一种特殊类型的文件,所以,某些参考资料将使用常规术语 文件 来包含目录和数据文件的概念。 出于此原因,除非另外指定,否则文件的任何命名或使用规则或示例也应该适用于目录。 术语 " 路径 " 是指一个或多个目录、反斜杠,还可能是卷名。 有关详细信息,请参阅 路径 部分。
字符计数限制还可以不同,并且可能因所使用的文件系统和路径名称前缀格式而异。 支持向后兼容机制,这会变得更加复杂。 例如,较旧的 MS-DOS FAT 文件系统最多支持8个字符,其中的基本文件名为3个字符,扩展名为3个字符,包括点分隔符。 这通常称为 8.3 文件名。 Windows FAT 和 NTFS 文件系统并不限于8.3 文件名,因为它们的文件名 支持时间较长,但它们仍支持长文件名的8.3 版本。
命名约定
以下基本规则使应用程序可以为文件和目录创建和处理有效名称,而不考虑文件系统:
-
使用句点将基文件名与目录或文件的名称中的扩展名分隔开来。
-
使用反斜杠 () 分隔 路径 的 组件。 反斜杠将文件名从路径中分隔到它,并将另一个目录名称从路径中的一个目录名称中分离。 不能在实际文件或目录的名称中使用反斜杠,因为它是将这些名称分隔到组件中的保留字符。
-
根据需要使用反斜杠作为卷名的一部分,例如,"c: path file" 中的 "c:" 或 "服务器共享路径" 中的 "服务器 \ \ \ \ \ \ 共享" ( \ \ \ \ \ 适用于通用命名约定) (UNC) 名称。 有关 UNC 名称的详细信息,请参阅 最大路径长度限制 部分。
-
不要假定区分大小写。 例如,将 OSCAR、Oscar 和 OSCAR 名称视为相同,即使某些文件系统 (例如 POSIX 兼容的文件系统,) 可能会将它们视为不同的。 请注意,NTFS 支持 POSIX 语义区分大小写,但这并不是默认行为。 有关详细信息,请参阅 CreateFile。
-
卷标识符 (驱动器号) 同样区分大小写。 例如,"D: \ " 和 "d: \ " 指的是同一个卷。
-
在当前代码页中使用任何字符作为名称,包括 Unicode 字符和扩展字符集中的字符 (128 – 255) ,如下所示:
- 以下保留字符:
- <(小于)
- > (大于)
- : (冒号)
- "(双引号)
- /(正斜杠)
- \ (反斜杠)
- | (竖线或管道)
- ? (问号)
- * (星号)
- 整数值零,有时称为 ASCII NUL 字符。
- 其整数表示形式在1到31范围内的字符,除了允许使用这些字符的备用数据流。 有关文件流的详细信息,请参阅 文件流。
- 目标文件系统不允许的任何其他字符。
-
使用句点作为路径中的目录 组件 来表示当前目录,例如 "。 \temp.txt "。 有关详细信息,请参阅 路径。
-
使用两个连续的句点 (。) 作为路径中的目录 组件 来表示当前目录的父目录,例如 ".。 \temp.txt "。 有关详细信息,请参阅 路径。
-
不要将以下保留名称用于文件的名称:
CON、PRN、AUX、NUL、COM1、COM2、COM3、COM4、COM5、COM6、COM7、COM8、COM9、LPT1、LPT2、LPT3、LPT4、LPT5、LPT6、LPT7、LPT8 和 LPT9。 还应避免使用后跟扩展名的这些名称;例如,不建议 NUL.txt。 有关详细信息,请参阅命名空间。
-
不要以空格或句点结束文件或目录名。 虽然底层文件系统可能支持这样的名称,但 Windows shell 和用户界面并不支持此类名称。 但是,可以将句点指定为名称的第一个字符。 例如 "temp"。
短名称与长名称
长文件名被视为超过短 MS-DOS 8.3 (的任何文件名) 样式命名约定。 当你创建一个长文件名时,Windows 还可能会创建一个名为的短8.3 格式的名称(称为 8.3 别名 或短名称),并将其存储在磁盘上。 根据特定文件系统的不同,可以禁用此8.3 别名,出于系统范围或指定的卷的性能原因。
在 Windows 7 和 Windows Server 2008 R2 之前, Windows server 2008、Windows Vista、Windows Server 2003 和 WINDOWS XP: 8.3 无法为指定的卷禁用别名。
在许多文件系统上,文件名将包含一个波形符 (~) 在名称过长,超过8.3 命名规则。
备注
并非所有文件系统都遵循颚化符替换约定,系统可以配置为禁用8.3 别名生成,即使它们通常支持。 因此,请不要假设磁盘上已存在8.3 别名。
若要从系统中请求8.3 文件名、长文件名或文件的完整路径,请考虑以下选项:
- 若要获取长文件名的8.3 形式,请使用 GetShortPathName 函数。
- 若要获取短文件名的长文件名版本,请使用 GetLongPathName 函数。
- 若要获取文件的完整路径,请使用 GetFullPathName 函数。
在较新的文件系统(例如 NTFS、exFAT、UDF 和 FAT32)上,Windows 将长文件名存储在磁盘上的 Unicode 中,这意味着始终保留原始长文件名。 即使长文件名包含扩展字符也是如此,而不考虑磁盘读取或写入操作期间处于活动状态的代码页。
可以在 NTFS 文件系统分区和 Windows FAT 文件系统分区之间复制使用长文件名的文件,而不会丢失任何文件名信息。 对于较旧的 MS-DOS FAT 和某些类型的 CDFS (CD-ROM) 文件系统,这可能不是真正的,具体取决于实际的文件名。 在这种情况下,将在可能的情况下替换短文件名。
路径
指定文件的 路径 由一个或多个组件组成,其中一个或多个 组件 以特殊字符分隔 (反斜杠) ,每个组件通常是目录名称或文件名,但有一些值得注意的例外。 通常,系统解释路径的开始或 前缀 的形式,这通常很重要。 此前缀确定路径使用的 命名空间 ,此外还会在路径内的哪个位置(包括最后一个字符)使用哪些特殊字符。
如果路径的组件是文件名,则它必须是最后一个组件。
路径的每个组件也将受针对特定文件系统指定的最大长度的约束。 通常,这些规则分为两类: short 和 long。 请注意,目录名称由文件系统存储为特殊类型的文件,但文件的命名规则也适用于目录名称。 总而言之,路径只是存在于特定文件或目录名的所有目录之间的层次结构的字符串表示形式。
完全限定与相对路径
对于操作文件的 Windows API 函数,文件名通常可以相对于当前目录,而某些 Api 需要完全限定的路径。 如果文件不是以下列其中一项开头,则相对于当前目录,文件名是相对的:
- 任何格式的 UNC 名称,始终以两个反斜杠字符开始 ( " \ \ " ) 。 有关更多信息,请参见下一节。
- 带有反斜杠的磁盘指示符,例如 "C: \ " 或 "d: \ "。
- 单个反斜杠,例如 " \ directory" 或 " \file.txt"。 这也称为 绝对路径。
如果文件名以仅磁盘指示符开头,而不是冒号后的反斜杠,则将其解释为具有指定字母的驱动器上的当前目录的相对路径。 请注意,当前目录可能是也可能不是根目录,具体取决于该磁盘上最新 "更改目录" 操作中设置的内容。 此格式的示例如下所示:
- "C:tmp.txt" 是指驱动器 C 上的当前目录中名为 "tmp.txt" 的文件。
- "C:tempdir \tmp.txt" 指的是指向驱动器 C 上的当前目录的子目录中的文件。
如果路径包含 "双点",则也称为相对路径;也就是说,路径的一个组件中同时有两个句点。 此特殊说明符用于表示当前目录(也称为 "父目录")上的目录。 此格式的示例如下所示:
- "..\tmp.txt "指定一个名为 tmp.txt 的文件,该文件位于当前目录的父目录中。
- "....\tmp.txt "指定一个文件,该文件是位于当前目录之上的两个目录。
- "..\tempdir \tmp.txt "指定名为 tmp.txt 的文件,该文件位于名为 tempdir 的目录中,该目录是当前目录的对等目录。
相对路径可以同时组合这两种示例类型,例如 "C:.. \tmp.txt "。 这非常有用,因为系统会跟踪当前驱动器以及该驱动器的当前目录,因此,它还会跟踪每个不同驱动器号的当前目录 (如果系统有多个) ,无论将哪个驱动器指示符设置为当前驱动器。
最大路径长度限制
在 Windows 10 版本1607之前的 Windows 版本中,路径的最大长度是 最大 _ 路径,该路径定义为260个字符。 在更高版本的 Windows 中,需要更改注册表项或使用组策略工具来消除此限制。 有关完整详细信息,请参阅 最大路径长度限制 。
命名空间
Windows Api 中使用了两个主要类别的命名空间约定,通常称为 NT 命名 空间和 Win32 命名空间。 NT 命名空间设计为最底层的命名空间,其中可能存在其他子系统和命名空间,包括 Win32 子系统和扩展的 Win32 命名空间。 POSIX 是 Windows 中在 NT 命名空间之上构建的子系统的另一个示例。 早期版本的 Windows 还为某些特殊设备(如通信 (串行和并行) 端口和默认显示控制台)定义了几个预定义的名称或保留的名称,作为现在称为 NT 设备命名空间的一部分,并且在当前版本的 Windows 中仍受支持,以实现向后兼容性。
Win32 文件命名空间
此部分和下一节概述了 Win32 命名空间前缀和约定,并说明了如何使用它们。 请注意,这些示例旨在与 Windows API 函数结合使用,并且不是所有都需要使用 windows shell 应用程序,如 Windows 资源管理器。 出于此原因,有一系列可能的路径范围比通常在 Windows shell 应用程序中提供的范围更广,利用此功能的 Windows 应用程序可以使用这些命名空间约定来开发。
对于文件 i/o,路径字符串的 " \ \ ? \ " 前缀会告知 Windows api 禁用所有字符串分析并将其后面的字符串直接发送到文件系统。 例如,如果文件系统支持大路径和文件名,则可以超过 Windows Api 所强制执行的 最大 _ 路径 限制。 有关一般最大路径限制的详细信息,请参阅上一节 最大路径长度限制。
由于它会关闭路径字符串的自动扩展,因此," \ \ ? \ " 前缀还允许在路径名称中使用 ".." 和 ".",这在您尝试使用这些其他保留的相对路径说明符作为完全限定的路径的一部分时,这会很有用。
许多(但不是所有)文件 i/o api 都支持 " \ \ ? \ "; 应查看每个 API 的参考主题以确保。
请注意,应使用 Unicode api,以确保 " \ \ ? \ " 前缀允许超出 最大 _ 路径
Win32 设备命名空间
" \ \ . \ " 前缀将访问 win32 设备命名空间,而不是 win32 文件命名空间。 如果 API 支持这种类型的访问,则可以直接访问物理磁盘和卷,而无需通过文件系统。 你可以通过这种方式访问多个设备,而不是使用 CreateFile 和 DefineDosDevice 函数 (,例如) 。
例如,如果要打开系统的串行通信端口1,则可以在调用 CreateFile 函数时使用 "COM1"。 这是因为,COM1 – COM9 是 NT 命名空间中保留名称的一部分,不过,使用 " \ \ . \ " 前缀也可用于这些设备名称。 相比之下,如果安装了100端口串行扩展板并想要打开 COM56,则不能使用 "COM56" 将其打开,因为没有预定义的 NT 命名空间用于 COM56。 你将需要使用 "" 来打开它 \ \ 。 \COM56 ",因为" \ \ . \ "直接转到设备命名空间,而不会尝试查找预定义的别名。
使用 Win32 设备命名空间的另一个示例是将 CreateFile函数与 "一起使用 \ \ 。 \PhysicalDisk x" (其中 x 是有效的整数值) 或" \ \ 。 \CdRom X"。 这使你可以直接访问这些设备,绕过文件系统。 这样做的原因是,系统会在枚举这些设备时创建这些设备名称,某些驱动程序还会在系统中创建其他别名。 例如,实现名称 "C:" 的设备驱动程序 \ 有自己的命名空间,也就是文件系统。
通过 CreateFile函数的 api 通常使用 " \ \ . \ " 前缀,因为 CreateFile 是用于打开文件和设备的函数,具体取决于所使用的参数。
如果使用的是 Windows API 函数,则应使用 " \ \ . \ " 前缀来访问设备,而不是文件。
大多数 api 不支持 " \ \ . \ "; 只有那些设计为与设备命名空间一起使用的 api 才能识别它。 请始终检查每个 API 的参考主题以确保。
NT 命名空间
还存在允许使用 NT 命名空间约定的 Api,但在大多数情况下,Windows 对象管理器会使其不必要。 为了说明这一点,使用 Windows Sysinternals WinObj 工具浏览系统对象浏览器中的 windows 命名空间非常有用。 当你运行此工具时,你看到的是 NT 命名空间,从根开始,或 " \ "。 名为 "Global??" 的子文件夹 Win32 命名空间所驻留的位置。 命名设备对象驻留在 "Device" 子目录中的 NT 命名空间内。 在此,还可以找到 Serial0 和 Serial1,这些设备对象表示系统中的前两个 COM 端口。 尽管数字后缀可能会有所不同,但表示卷的设备对象将类似于 "HarddiskVolume1"。 "Harddisk0" 子目录下的 "DR0" 名称是表示磁盘的设备对象的示例,依此类推。
为了使这些设备对象可由 Windows 应用程序访问,设备驱动程序会创建一个符号链接, (将 Win32 命名空间中的符号 "Global??") 到其各自的设备对象。 例如,"Global??" 下的 COM0 和 COM1 子目录只是符号链接到 Serial0 和 Serial1,"C:" 是 HarddiskVolume1 的链接,"Physicaldrive0" 是指向 DR0 的符号,等等。 如果没有符号符号,使用 Win32 命名空间约定的任何 Windows 应用程序都将无法使用指定的设备 "Xxx",如前文所述。 但是,可以使用任何支持 NT 命名空间绝对路径 " \ device Xxx" 格式的 api 打开该设备的句柄 \ 。
通过终端服务和虚拟机添加多用户支持,在 Win32 命名空间内对系统范围内的根设备进行虚拟化还有必要进一步。 为此,可将名为 "GLOBALROOT" 的符号添加到 Win32 命名空间,该命名空间可以在 "Global??" 中看到。 前面讨论过的 WinObj 浏览器工具的子目录,可以通过路径 " \ \ ? \GLOBALROOT". 此前缀确保其后面的路径在系统对象管理器的真实根路径中显示,而不是与会话相关的路径。
8.3命名规则_百度百科
https://baike.baidu.com/item/8.3%E5%91%BD%E5%90%8D%E8%A7%84%E5%88%99/9294087
8.3文件名 - 维基百科,自由的百科全书
https://zh.wikipedia.org/zh/8.3%E6%96%87%E4%BB%B6%E5%90%8D
8.3文件名是一种文件名规范,它主要运用于FAT文件系统中。其后继者NTFS文件系统也支持8.3文件名。这种规范之所以被称为“8.3”,是因为其文件名的特殊格式:文件名的主体部分最多只能包含8个字符,而文件扩展名最多只能包含3个字符。二者之间用“.”相连。8.3文件名的目录和文件名都仅使用大写字母,但DOS和命令提示符都不大小写敏感(当然,如果使用UNIX或类Unix等一般大小写敏感的操作系统,则应注意)。
8.3文件名必须包含主体文件名,但不必须包含扩展名,二者之间用“.”相连。但是如果输入“.”后没有输入扩展名,则“.”没有意义,会被忽略。比如12345678.
会被系统保存为12345678
。
发表评论