Windows如何确定/处理任何给定文件的DOS短名称?

我有这些文件的文件夹:

alongfilename1.txt <--- created first alongfilename3.txt <--- created second 

当我在命令提示符下运行DIR / x时,我看到这些简称:

 ALONGF~1.TXT alongfilename1.txt ALONGF~2.TXT alongfilename3.txt 

现在,如果我添加另一个文件:

 alongfilename1.txt alongfilename2.txt <--- created third alongfilename3.txt 

我看到这个:

 ALONGF~1.TXT alongfilename1.txt ALONGF~3.TXT alongfilename2.txt ALONGF~2.TXT alongfilename3.txt 

精细。 它似乎是根据我创build文件的date/时间分配“〜#”。 它是否正确?

现在,如果我删除“alongfilename1.txt”,其他两个文件保留其短名称

 ALONGF~3.TXT alongfilename2.txt ALONGF~2.TXT alongfilename3.txt 

什么时候将这个ID(在这种情况下,〜1)释放用于另一个短名称。 它会永远吗?

另外,我的机器上的文件有可能是X的短名称,而同一个文件在另一台机器上的名称是Y? 我特别担心自定义操作使用DOS短名称的安装。

多谢你们。

Solutions Collecting From Web of "Windows如何确定/处理任何给定文件的DOS短名称?"

短文件名是用该文件创建的。 算法是这样的(通常,但请参阅moocha的回复 ):

 counter = 1 stripped_filename = strip_dots(strip_non_ascii_characters(filename)) shortfn = first_6_characters(stripped_filename) while (file_exists(shortfn + "~" + counter + "." + extension)) { increment counter by 1 if more digits are added to counter, shorten shortfn by 1 /* eg if counter comes to 9 and shortf~9.txt is taken. try short~10.txt next */ } 

这意味着,一旦文件被创建,它将保持其短名称,直到它被删除。

一旦文件被删除,短名称可能会再次使用。

如果你把文件移动到其他地方,它可能会得到一个新的短名称(例如,你将c:\ somefilewithlongname.txt(“c:\ somefi〜1.txt”)移动到d:\ stuff \ somefilewithlongname.txt,if有d:\ stuff \ somefileelse.txt(“d:\ stuff \ somefi〜1.txt”),被移动的文件的简称会变成2.fixt)。 短名似乎只在给定机器上的给定目录中持久存在。

所以:短文件名将由文件系统生成,通常使用上面概述的方法。 假设短文件名不是永久的,因为一台机器上的c:\ longfi〜1.txt可能是“c:\ longfilename.txt”,而在另一台机器上可能是“c:\ longfish_story.txt”; 另外,当文件被删除时,短名称将立即再次可用。

如果我是你的话,我永远不会依赖于任何文件系统驱动程序的任何版本(无论是微软公司的,也可能是另一个操作系统的),以保持它用于生成短文件名的算法的一致性。 Microsoft Fastfat和NTFS驱动程序的确切行为不是“正式”记录的(除非是略高级的概述),因此不属于API合同的一部分。 如果您更新驱动程序,今天的工作可能无法在明天工作。

另外,绝对不要求短名称包含代字符,例如Raymond Chen的这篇文章 。

在MSDN博客中有关于此主题的信息宝库,例如:

  • 注册表项以强制Windows使用短文件名
  • NTFS好奇心(第一部分):短文件名

另外,不要只依赖字母数字字符。 看一下Linux VFAT驱动程序 ,例如,大写字母,数字和下列字符的任意组合都是有效的:$%“ – @ {}〜! #()&_ ^。 NTFS将以兼容模式运行

我相信MSDOS在每个目录文件中存储长名称和短名称之间的关联。

这并不取决于日期/时间。

如果你把你的文件移动到一个新的目录中,这将会重新设置Piskvor提到的算法

在新的目录中(移动之后),你会得到:

 ALONGF~1.TXT alongfilename1.txt ALONGF~2.TXT alongfilename2.txt ALONGF~3.TXT alongfilename3.txt 

即使alongfilename2.txt最初是第三次创建的。

这个链接说NTFS如何做。 我猜想在更新的版本上它仍然是一样的想法。

在Windows 2000中,FAT和NTFS都使用Unicode字符集作为其名称,其中包含MS-DOS无法读取的几个禁止字符。 要生成一个简短的MS-DOS可读文件名,Windows 2000将从LFN中删除所有这些字符并删除所有空格。 由于MS-DOS可读的文件名只能有一个句点,Windows 2000也会从文件名中删除所有额外的句点。 接下来,如果需要,Windows 2000会将文件名截断为六个字符,并附加波形符号(〜)和数字。 例如,每个非重复的文件名都附加〜1。 重复的文件名以〜2结尾,然后〜3,依此类推。 文件名被截断后,文件扩展名被截断为三个或更少的字符。 最后,在命令行显示文件名时,Windows 2000将文件名和扩展名中的所有字符转换为大写。

当文件由运行Samba的网络服务器提供时,短名称由服务器生成,并且不遵循可预测的模式。

所以假设你可以预测短名称的形式是不安全的。

  G:\>dir /x *.txt Directory of G:\ 08/25/2009 12:34 PM 1,848 S2XYYV~1.TXT strace_output.txt 03/01/2010 05:32 PM 325,428 TEY7IH~O.TXT tomcat-dump-march-1.txt 03/11/2010 12:01 AM 5,811 DI356A~S.TXT ddmget-output.txt 01/23/2009 01:03 PM 313,880 DLA94Q~K.TXT ddm-log-fn.txt 04/20/2010 07:42 PM 7,491 A50QZP~A.TXT april-20-2010.txt