Windows命名文件,路径和命名空间

Windows支持的所有文件系统都使用文件和目录的概念来访问存储在磁盘或设备上的数据。使用Windows API进行文件和设备I / O的Windows开发人员应了解文件和目录名称的各种规则,约定和限制。

可以使用文件I / O API从磁盘,设备和网络共享访问数据。文件和目录以及名称空间是路径概念的一部分,路径是对数据获取位置的字符串表示,无论数据是来自磁盘,设备还是用于特定操作的网络连接。

某些文件系统(例如NTFS)支持链接的文件和目录,它们也遵循文件命名约定和规则,就像常规文件或目录一样。有关更多信息,请参见“硬链接和连接点以及重新解析点和文件操作”。

有关其他信息,请参见以下小节:

文件名和目录名
命名约定
短名与长名
路径
完全合格与相对路径
最大路径长度限制
命名空间
Win32文件命名空间
Win32设备命名空间
NT命名空间
相关话题
要了解有关配置Windows 10以支持长文件路径的信息,请参阅最大路径长度限制。

文件名和目录名
对于单个文件,所有文件系统都遵循相同的通用命名约定:基本文件名和可选的扩展名,以句点分隔。但是,每个文件系统(例如NTFS,CDFS,exFAT,UDFS,FAT和FAT32)对于在目录或文件路径中各个组件的形成都可以有特定且不同的规则。请注意,目录只是具有特殊属性的文件,将其指定为目录,但否则必须遵循与常规文件相同的所有命名规则。因为就文件系统而言,目录一词仅指一种特殊类型的文件,所以某些参考资料将使用通用术语文件包含目录和数据文件本身的概念。因此,除非另有说明,否则文件的任何命名或使用规则或示例也应适用于目录。术语路径是指一个或多个目录,反斜杠以及可能的卷名。有关更多信息,请参见路径部分。

字符数限制也可以不同,并且可以根据文件系统和使用的路径名前缀格式而有所不同。对后向兼容机制的支持使情况更加复杂。例如,较早的MS-DOS FAT文件系统最多支持8个字符的基本文件名和3个扩展名的字符,包括点分隔符在内总共12个字符。这通常称为8.3文件名。Windows FAT和NTFS文件系统不限于8.3文件名,因为它们支持长文件名,但它们仍支持8.3版本的长文件名。

命名约定
以下基本规则使应用程序可以创建和处理文件和目录的有效名称,而与文件系统无关:

使用句点将基本文件名与目录或文件名中的扩展名分开。

使用反斜杠(\)到分离的部件a的路径。反斜杠将文件名从路径分开,并将一个目录名与路径中的另一个目录名分开。您不能在实际文件或目录的名称中使用反斜杠,因为它是一个保留字符,将名称分隔为多个部分。

作为卷名的一部分,请根据需要使用反斜杠,例如,“ C:\ path \ file”中的“ C:\”或“ \\ server \ share \ path \ file”中的“ \\ server \ share”通用命名约定(UNC)名称。有关UNC名称的更多信息,请参见最大路径长度限制部分。

不要假设大小写敏感。例如,即使某些文件系统(例如POSIX兼容文件系统)可能认为它们不同,也应将名称OSCAR,Oscar和oscar视为相同。请注意,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 Server 2008,Windows Vista,Windows Server 2003和Windows XP:在Windows 7和Windows Server 2008 R2之前,不能为指定的卷禁用8.3别名。

在许多文件系统上,文件名的每个组成部分中都将包含波浪号(〜),该波浪号太长而无法遵守8.3命名规则。

 注意

并非所有文件系统都遵循波浪号替换约定,并且可以将系统配置为禁用8.3别名生成,即使它们通常支持它也是如此。因此,请勿假设磁盘上已经存在8.3别名。

 

要从系统请求8.3文件名,长文件名或文件的完整路径,请考虑以下选项:

若要获取8.3格式的长文件名,请使用GetShortPathName函数。
要获取短名称的长文件名版本,请使用GetLongPathName函数。
要获取文件的完整路径,请使用GetFullPathName函数。
在较新的文件系统(例如NTFS,exFAT,UDFS和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”指定位于名为tempdir的目录中的名为tmp.txt的文件,该目录是当前目录的对等目录。
相对路径可以合并两个示例类型,例如“ C:.. \ tmp.txt”。这很有用,因为尽管系统会跟踪当前驱动器以及该驱动器的当前目录,但它也会跟踪每个不同驱动器号(如果系统有多个)中的当前目录,无论哪个驱动器指示符被设置为当前驱动器。

最大路径长度限制
在Windows 10版本1607之前的Windows版本中,路径的最大长度是MAX_PATH,它定义为260个字符。在Windows的更高版本中,需要更改注册表项或使用组策略工具才能删除限制。有关完整详细信息,请参见最大路径长度限制。

命名空间
Windows API中使用的命名空间约定主要有两类,通常称为NT命名空间和Win32命名空间。NT名称空间被设计为可以存在其他子系统和名称空间的最低级别的名称空间,包括Win32子系统以及扩展的Win32名称空间。POSIX是Windows中基于NT名称空间构建的子系统的另一个示例。Windows的早期版本还为某些特殊设备(如通信(串行和并行)端口和默认显示控制台)定义了一些预定义或保留的名称,这些名称现在称为NT设备名称空间,在当前版本中仍受支持。 Windows的向后兼容性。

Win32文件命名空间
本节和下一节总结了Win32名称空间前缀和约定,并说明了如何使用它们。请注意,这些示例旨在与Windows API函数一起使用,并不一定都与Windows Shell应用程序(例如Windows Explorer)一起使用。因此,可能的路径范围比Windows Shell应用程序通常提供的路径范围更大,并且可以使用这些命名空间约定来开发利用此功能的Windows应用程序。

对于文件I / O,路径字符串的前缀“ \\?\”告诉Windows API禁用所有字符串解析,并将其后的字符串直接发送到文件系统。例如,如果文件系统支持大路径和文件名,则可以超过Windows API强制实施的MAX_PATH限制。有关正常最大路径限制的更多信息,请参见上一节“最大路径长度限制”。

因为它关闭了路径字符串的自动扩展,所以前缀“ \\?\”也允许使用“ ..”和“。”。在路径名中,如果您尝试使用这些保留的相对路径说明符作为标准路径的一部分来对文件执行操作,这将很有用。

许多但不是全部文件I / O API支持“ \\?\”;您应该查看每个API的参考主题以确保。

Win32设备命名空间
“ \\。\”前缀将访问Win32设备名称空间,而不是Win32文件名称空间。如果API支持这种类型的访问,则可以通过此方法直接完成对物理磁盘和卷的访问,而无需通过文件系统。您可以通过这种方式访问磁盘以外的许多设备(例如,使用CreateFile和DefineDosDevice函数)。

例如,如果要打开系统的串行通信端口1,则可以在对CreateFile函数的调用中使用“ COM1” 。这是可行的,因为COM1-COM9是NT名称空间中保留名称的一部分,尽管使用“ \\。\”前缀也可以与这些设备名称一起使用。相比之下,如果您安装了100端口串行扩展板并想打开COM56,则不能使用“ COM56”打开它,因为没有针对COM56的预定义NT名称空间。您将需要使用“ \\。\ COM56”打开它,因为“ \\。\”直接转到设备名称空间,而不会尝试找到预定义的别名。

使用Win32设备名称空间的另一个示例是将CreateFile函数与“ \\。\ PhysicalDisk X ”(其中X是有效的整数值)或“ \\。\ CdRom X ”一起使用。这样,您可以绕过文件系统直接访问那些设备。之所以可行,是因为这些设备名称是由系统在枚举这些设备时创建的,并且某些驱动程序还将在系统中创建其他别名。例如,实现名称“ C:\”的设备驱动程序具有自己的名称空间,该名称空间也恰好是文件系统。

通过CreateFile函数的API通常使用“ \\。\”前缀,因为CreateFile是用于打开文件和设备的函数,具体取决于您使用的参数。

如果使用Windows API函数,则应使用“ \\。\”前缀仅访问设备,而不访问文件。

大多数API不支持“ \\。\”;只有那些旨在与设备名称空间一起使用的设备才能识别它。请务必检查每个API的参考主题,以确保正确。

NT命名空间
还有一些API允许使用NT名称空间约定,但是Windows Object Manager在大多数情况下都不需要这样做。为了说明这一点,使用Windows Sysinternals WinObj在系统对象浏览器中浏览Windows命名空间非常有用。工具。运行此工具时,您看到的是从根(或“ \”)开始的NT名称空间。子文件夹称为“ Global ??” 是Win32名称空间所在的位置。命名的设备对象位于“设备”子目录中的NT名称空间中。在这里,您还可以找到Serial0和Serial1,它们是表示系统上存在的前两个COM端口的设备对象。代表卷的设备对象将类似于“ HarddiskVolume1”,尽管数字后缀可能有所不同。子目录“ Harddisk0”下的名称“ DR0”是代表磁盘的设备对象的示例,依此类推。

为了使Windows设备可以访问这些设备对象,设备驱动程序在Win32命名空间“ Global ??”中创建指向其各自设备对象的符号链接(symlink)。例如,“ Global ??”下的COM0和COM1 子目录只是指向Serial0和Serial1的符号链接,“ C:”是指向HarddiskVolume1的符号链接,“ Physicaldrive0”是指向DR0的符号链接,依此类推。如果没有符号链接,则如上所述,使用Win32名称空间约定的Windows应用程序将无法使用指定的设备“ Xxx”。但是,可以使用任何支持“ \ Device \ Xxx”格式的NT命名空间绝对路径的API对该设备打开句柄。

通过终端服务和虚拟机增加了多用户支持,进一步有必要在Win32名称空间内虚拟化系统范围的根设备。这是通过在Win32名称空间中添加名为“ GLOBALROOT”的符号链接来完成的,您可以在“ Global ??”中看到该符号链接。先前讨论的WinObj浏览器工具的子目录,并且可以通过路径“ \\?\ GLOBALROOT”进行访问。此前缀确保其后的路径显示在系统对象管理器的真实根路径中,而不是会话相关的路径。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows Server 2016可以作为文件服务器来使用。以下是设置Windows Server 2016文件服务器的步骤: 1. 安装文件服务角色和功能 在Server Manager中,选择“添加角色和功能”向导,选择“文件和存储服务”,选择“文件和 iSCSI 服务”,确保“文件服务器”和“SMB 1.0/CIFS 文件共享支持”选中。 2. 创建共享文件夹 在文件资源管理器中,右键单击要共享的文件夹,选择“共享和安全”选项,然后单击“共享”按钮。在共享向导中,选择“高级共享”,选择“共享此文件夹”,输入共享名称,并设置共享权限和访问权限。 3. 配置访问权限 在“共享和安全”选项中,选择“安全”选项卡,单击“编辑”按钮,添加用户或组的权限。 4. 配置文件服务器设置 在Server Manager中,选择“文件和存储服务”,选择“文件服务器”,选择“常规”,设置本地路径和其他设置。 5. 启用DFS名称空间和复制 在Server Manager中,选择“文件和存储服务”,选择“DFS 名称空间”,右键单击“名称空间”,选择“新建命名空间”,选择“创建一个新的命名空间根”,设置根目录和名称。 6. 配置备份 使用Windows Server Backup或其他备份软件对文件服务器进行备份,以保护数据安全。 以上是设置Windows Server 2016文件服务器的一些步骤,可以根据实际需要进行调整和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值