Naming Files, Paths, and Namespaces

来源:互联网 发布:蒋介石发动内战数据 编辑:程序博客网 时间:2024/04/29 17:56

Windows所支持的所有的文件系统都用文件和目录的概念来访问存储在设备或磁盘中的数据。

利用Windows APIS进行文件操作或设备IIO的Windows开发者必须理解文件和目录的各种规则,约定,和限制。

可以利用IO APIs访问磁盘,设备或者网络共享中的数据。文件,目录,还有命名空间,都是路径的一部分。

这个路径是一个可以忽视被访问者的类型(无论是磁盘还是设备或网络)的用来表示在哪获取数据的字符串。

一些文件系统,如NTFS,支持链接的文件和目录,和普通文件和目录一样,符合文件命名约定和规则。

要了解更多信息,请参见Hard Links and Junctions和解析分和Reparse Points and File Operations

所有的文件系统都遵循与单个文件相同的通用命名约定:一个基本文件名称和一个可选的扩展,并用句号隔开。

然而,每个文件系统,如NTFS,CDFS,exFAT,udf,FAT和FAT32,在组成指向目录和文件的路径元素的个人部分可以有特定的和不同的规则。
注意,一个目录就是一个具有特定属性指定他是目录的简单文件而已,同样也得遵循普通文件所遵循的命名规则。
因为文件系统关心的只是目录作为一个特殊格式的文件,一些参考资料将使用通用术语文件来包含目录和数据文件这两个概念。
正因为如此,除非另有说明,任何一个文件的命名或使用规则或例子应该也适用于一个目录。术语路径是指一个或多个目录,反斜杠,可能还有一个卷名。

有关更多信息,请参见Paths部分。

字符计数限制也可以是不同的,并且可以随文件系统和路径名称前缀格式使用不同而不同,这被支持向后兼容的机制进一步复杂化。

例如,ms - dos FAT文件系统支持最多8个字符的基本文件名称和3个字符的扩展,共12个字符,包括点号分隔符。

这是一个通常被称为8.3的文件名字。Windows FAT和NTFS文件系统并不限于8.3文件名,因为他们有长文件名的支持,但他们仍然支持8.3版本的长文件名。

Naming Conventions

 

命名约定 :

下面的基本规则确保应用程序能为文件和目录创建和处理有效的名称,而且能忽视文件系统:

  在一个目录或文件的名字中使用句号来隔开文件名和扩展

使用一个反斜杠(\)来分离路径的成分。反斜杠将文件名和指向他的路径分开,同时隔开各个目录名。

在实际的文件的名称或目录中你不能使用反斜杠,因为它是一个将名称划分为多个部分的保留字符

根据要求使用反斜杠作为卷名称的一部分,例如,通用的命名约定(UNC)名字,"C:\path\file"中的“C:\”,或\\server\share\path\file中的\\server\share。

更多信息,请查看Maximum Path Length Limitation

不要假设大小写敏感性。例如,OSCAR, Oscar, 和 oscar被认为是同一个名字。尽管一些文件系统(比如一个与posix兼容的文件系统)会认为它们是不同的。

注意,NTFS支持POSIX语义中的大小写敏感性,但这不是默认的行为。有关更多信息,请参见CreateFile.

卷标识符同样是不区分大小写的,“D:\ "和" D:\ "指相同的卷。

任何名字的字符,包括Unicode字符和字符扩展字符集(128 - 255),必须使用在当前的代码页,除了下面的:

  。保留字符

  • < (less than)
  • > (greater than)
  • : (colon)
  • " (double quote)
  • / (forward slash)
  • \ (backslash)
  • | (vertical bar or pipe)
  • ? (question mark)
  • * (asterisk)
整数值零,有时也称为ASCII NUL字符

字符的整数值为从1到31,除非在允许这些字符的可选数据流中。文件流的更多信息,请参阅File Streams.

目标文件系统不允许的任何其他字符

在路径中使用句点作为目录的一部分来表示当前目录。例如“.\ temp txt”。有关更多信息,请参见Paths.

在路径中使用两个连续句点(..)作为目录的部分来表示当前目录的父目录。例如"..\temp.txt".有关更多信息,请参见Paths.

不要使用以下保留名称为一个文件的名称:

CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9.

也要避免这些名字紧跟着一个扩展;例如,NUL.txt最好不要用。有关更多信息,请参见Namespaces.

不要以句点或空格来结束一个文件或目录。尽管底层文件系统可能支持这样的名字,但Windows shell和用户接口并不支持。

然而,它是可以接受指定一个句点作为文件名的字符,例如,".temp".

Short vs. Long Names

一个长文件名可以认为是任何超过短ms - dos(也称为8.3)风格的命名约定的文件的名字。

通常,Windows在磁盘上存储长文件名作为特殊目录的入口,在特定系统中,基于性能的考虑,也可以禁用此方式。

当你创建一个长文件名,Windows也可以创建一个短8.3形式的名字,叫做8.3别名,并将其存储在磁盘上。

指定的卷可以禁用8.3别名。Windows 7 and Windows Server 2008 R2以下的版本不能为特定卷禁用别名。

在许多文件系统中,一个文件的名字将在文件名的每个相对8.3命名规则来说太长的部分加上一个波浪线号(~)。

注意并不是所有的文件系统遵循波浪字符替换约定,而且系统可以配置为禁用8.3别名即使他们通常支持它。

因此,不要假设8.3别名已经存在磁盘上。

从系统请求8.3文件名称、长文件名,或一个文件的完整路径,考虑以下选择:

获得8.3形式的一个长文件名,使用GetShortPathName函数

需要把短名称变成长文件名版本,使用GetLongPathName函数。

获得一个文件的完整路径,使用GetFullPathName函数。

Paths

指向指定文件的路径包含一个或多个部分,并用特殊字符隔开(反斜杠),每个部分通常是一个目录名称或文件的名字,下面讨论一些例外。

解释一个路径是什么开始,或前缀通常是关键的

这个前缀确定了这个路径的命名空间,而且决定了路径中在哪个位置使用了什么特殊字符,包括最后一个字符。

如果一个路径的一个部分是一个文件名,它必须是最后一个部分。

路径的每个部分的长度必须限制在特定文件系统指定的最大长度范围内。一般来说,这些规则分为两类:短和长的。

注意到目录被文件系统存储为一个特殊类型的文件,但命名规则仍然适用于目录。总的来说,一个路径只是代表一个特定的文件或目录名在所有的目录之间的所在的层级的字符串。

完全和相对路径。

对于操作文件的Windows API函数,文件名称通常是相对于当前目录,但一些api需要一个完全限定路径。

一个文件的名字是相对于当前目录,如果它没有开始与下列之一:

一个任何格式的UNC名称,它总是以两个反斜杠字符(“\ \ ")开始。

一个磁盘标示与反斜杠,例如“C:\ "或" d:\ "。

一个反斜杠,例如,“\目录”或“\文件txt”。这也称为一个绝对路径。

如果一个文件的名字只有一个磁盘标识但冒号之后没有反斜杠,他将被解释为指定了这个字母的驱动上的当前目录的相对路径。

注意,当前目录可能是也可能不是根目录,这都取决于在磁盘上最近的“更改目录”操作对他怎么设置。这种格式的示例如下:

“C:tmp。txt”是指一个在驱动C上当前目录下命名为“tmp。txt”的文件。

“C:\ tmp tempdir。txt”是指在c驱动上当前目录的子目录下的一个文件

路径中的连续的两个句点标示当前目录的父目录,例如:

"..\..\tmp.txt"表示一个文件所在目录的父目录的父目录下的同名文件。

"..\tempdir\tmp.txt"表示当前目录的父目录下的某文件夹下的某文件。

相对路径还可以结合以上两种情况,如"C:..\tmp.txt".

在Windows API中,以MAX_PATH标示文件路径的最大长度,并定义其为260个字符的长度。

一个当地的路径是按下列顺序结构化的:驱动器号、冒号、反斜杠、反斜杠隔开着的名字,终止字符null。

“< NUL >”代表着当前系统的代码页不可视的终止null字符,(字符< >是在这里用于可视化,不能作为有效路径字符串的一部分。)

在Windows API中的文件I / O函数将"/"转换为"\"以作为把名字转换为NT类型的名字的一部分,除非使用“\ \ ?\ "前缀。下面几节详细讨论。

Windows API有许多函数,包括允许一个最大总路径长度为32767个字符的扩展长度路径的Unicode版本。

这种类型的路径是由反斜杠分隔各部分的,这取决于GetVolumeInformation函数的lpMaximumComponentLength参数的返回值

使用“\ \ ?\”前缀指定一个扩展长度路径。

注意最大路径的32767个字符是近似的,因为在该系统在运行时,“\ \ ?\ "前缀可能被扩展为更长的字符串,且总长度中包含扩展后的长度。

“\ \ ?\ "前缀也可以被根据一般的命名约定(UNC)构造的路径使用,指定这样一个UNC路径的使用使用“\ \ ?\ UNC \”前缀。

例如,“\ \ ? \ UNC \ server \share”,"server"是电脑的名称,"share"是共享文件夹的名称。

这些前缀是不能作为路径本身的部分的。使用这种前缀的路径不能使用"/"分隔符,不能使用句点表示当前目录或双句点表示父目录。

,因为你不能在相对路径中使用“\ \ ?\ ",因为相对路径的长度被限制在MAX_PATH内。

Namespaces

 

在Windows APIs中命名空间的约定主要有两个分类,通常被称为NT名称空间和Win32名称空间。

NT名称空间被设计用于最底层的名称空间,在其上可能存在其他子系统和名称空间,包括Win32子系统,Win32名称空间。

POSIX是另一个建立在NT名称空间上的子系统,Windows的早期版本也为某些特殊的设备,如通信端口定义了一些预定义字符,或保留字符,名字默认控制台

作为现在称为NT名称空间的一部分。而且因为反相兼容而在当前版本的Windows下仍然适用。

Win32 File Namespaces

对于文件I / O,路径的“\ \ ?\ "前缀字符串告诉Windows api禁用所有字符串解析,把它后面的字符串直接发送到系统。

因为它关闭了路径字符串的自动扩张,“\ \ ?\ "前缀也允许在这个路径名中使用" . .“和”.“,

在这个路径名

Win32 Device Namespaces

“\ \。\ "前缀将访问Win32设备名称空间而不是Win32文件名称空间。

你可以利用这种方式访问除了磁盘外的许多设备。

例如,如果你想打开系统的串行通信端口1,你可以在createfile函数中使用“COM1”,因为COM1-COM9是NT名称空间中的保留字符,

尽管利用“\ \。\ "前缀使用这些设备名称也可以。但,如果你有100个COM口,你就不能用直接用“COM56”了,你必须用\\.\COM56打开它

NT Namespaces

有api,允许使用NT名称空间约定,但是Windows对象管理器使得这在大部分情况下不必要

使用Windows Sysinternals WinObj工具的系统对象浏览器查看Windows命名空间是非常有用的。

你看到的是NT名称空间始于根目录或“\”。Win32名称空间驻留在"Global??"子文件夹下,设备对象的命名在在“设备”子目录下。

为使Windows应用程序能够访问设备对象,设备驱动通常会在Win32名称空间下创建一个符号链接。

如"Global??"下的COM0,是在“设备”子目录下Serial0的符号链接。如果没有创建符号链接,就不能使用Win32命名空间打开设备,但是仍然可以使用

支持NT命名空间的API打开设备,其路径格式为"\Device\Xxx".

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击