【翻译】Windows下文件的命名
更全面的原文在这里: http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
为文件命名
尽管每个文件系统对各自的文件夹或文件的命名格式都有具体的规定,但是所有的系统都遵循着一个通用的约定:一个基本文件名(base file name)和一个可选的扩展名,它们之间被一个点号分开。
例如,MS-DOS FAT 文件系统支持8字符长得基本文件名和3字符长的扩展名。这被称为8.3文件名。FAT文件系统和NTFS文件系统没有8.3文件名的限制,因为它们支持长文件名(long file name)。
命名约定
不管是什么文件系统,下面这些规则使应用程序能够创建和处理可用的文件名:
l 使用点号(.)来分割基本文件名和扩展文件名。
l 使用反斜杠(\)将文件路径分割成若干部分。不能使用反斜杠作为文件或文件夹的名字。
但是反斜杠可以作为卷标名的一部分,例如:”C:\”。
统一命名约定(UNC)必须满足如下格式:\\<server>\<share>
l 除了ASCII中编码为0-31的字符或者任何文件系统不允许出现的字符外,可以在代码中使用任何其他字符作为一个文件名。一个文件名可以包含扩展的字符集(128-255)中的字符。但是它不能包含如下保留的字符:< > : “ / \ | ? *
l 在路径中,点号(.)表示当前路径。
l 在路径中,两个连续的点(..)表示当前路径的上级路径。
l 不要使用保留的设备名作为一个文件名:
CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9
也不能使用这些名字后面带有一个扩展名,例如:NUL.tx7
l 大小写不敏感。OSCAR, Oscar和oscar是同一个名字。
l 文件名或目录名不要以空格或点号(.)结尾。
尽管基础的文件系统可能支持这样的名字,但是操作系统不支持。
最大路径长度
在Windows API中,路径的最大长度为MAX_PATH,MAX_PATH被定义为260。一个路径的结构如下所示:
|盘符|冒号|反斜杠|被反斜杠所划分的若干部分|NUL(‘\0’)|,例如:D:\<256 chars>NUL.
Note:Windows API中的函数将”/”转换成”\”,使之成为NT风格名字的一部分。
许多API函数的Unicode版本允许最大长度大约为32000个字符的路径,这种路径的每个部分最长由255个字符组成。(The Unicode versions of several functions permit a maximum path length of approximately 32,000 characters composed of components up to 255 characters in length)。要指定这种路径,需要使用”\\?\”作为前缀。
NOTE:最大的路径长度:32000字符是一个大概的数字,因为”\\?\”前缀能够扩展为一个更长的字符串,并且这个扩展在总长度中也被计算。
例如:”\\?\D:\<path>”。要指定这样一个UNC路径,使用”\\?\UNC\”前缀。例如:”\\?\UNC\<server>\<share>”。这些前缀本身不作为路径的一部分。它们表示被传递给系统的路径应该做一些最小限度的变化,这意味着不能使用斜杠(/)来表示路径分隔符,并且不能使用一个点号(.)来代表当前路径。同时,带有”\\?\”前缀的路径不能使用相对路径。相对路径被限制在MAX_PATH个字符。
当使用API创建一个目录时,指定的路径不能太长导致不能附加一个8.3格式的文件名。也就是说目录名字不能超过MAX_PATH减去12。
shell和文件系统会有不同要求。这就使得我们能够使用API创建一个shell UI不能操纵的路径。
相对路径
对于操纵文件的函数来说,文件名可以是相对于当前路径的。如果一个文件名不以下面的结构开头,则这个文件名是相对于当前路径的:
l 一个盘符,这个盘符后面紧跟着一个冒号,或者是一个server名字和共享名(\\servername\\sharename)
l 一个目录名字分隔符,如一个反斜杠,例如,\subdir
如果文件名以盘符和反斜杠开头,那么它是一个全路径(full path),例如:c:\temp。如果文件名仅以盘符开头,它是一个当前目录的相对路径。例如,c:temp.txt表示C盘当前目录的一个文件。
短文件名和长文件名
通常,Windows在磁盘上存储长文件名作为指定目录的入口,但是这种方式有性能上的缺陷。当你创建一个长文件名时,Windows也创建了一个短的MS-DOS(8.3)格式的文件名。在许多文件系统中,一个短文件名包含一个波浪字符(~),但是不是所有的文件系统都符合这个约定,因此不要做这样的假设。
要想获取一个文件的MS-DOS文件名,长文件名或全路径,你可以按下面的方法做:
l 获取一个长文件名的MS-DOS文件名,使用GetShortPathName函数。
l 获取一个短文件名的长文件名,使用GetLongPathName函数。
l 获取一个文件的全路径,使用GetFullPathName函数。
Windows在磁盘上以Unicode码存储长文件名,这意味着原始的长文件名总是被保存,即使包含扩展的字符。文件名的大小写被保存,但是文件系统是大小写不敏感度的。
长文件名可用的字符集是Unicode文件系统可用的字符集减去冒号(:),冒号在NTFS文件系统中用于打开单个的文件流,这意味着当你在NTFS文件系统和FAT文件系统之间拷贝文件时,不会丢失任何文件名信息。