我有一个包含这些文件的文件夹:
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
精细。它似乎是根据我创建文件的日期/时间分配“〜#”。它是否正确?
现在,如果我删除“alongfilename1.txt”,则另外两个文件 保留他们的简称。
ALONGF~3.TXT alongfilename2.txt
ALONGF~2.TXT alongfilename3.txt
何时释放该ID(在本例中为~1)以用于另一个短名称。它会永远吗?
另外,我的机器上的文件是否可能有短名称X,而同一文件在另一台机器上有短名称Y?我特别担心其自定义操作使用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
/* e.g. 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,如果有d:\ stuff \ somefileelse.txt(“d:\ stuff \ somefi~1.txt”),移动文件的短名称将是somefi~2.txt)。似乎短名称仅在给定计算机上的给定目录中持久存在。
所以:短文件名将由文件系统生成,通常通过上面概述的方法生成。最好假设短文件名不是持久的,因为一台机器上的c:\ longfi~1.txt可能是“c:\ longfilename.txt”,而另一台机器上的c:\ longfi~1.txt可能是“c:\ longfish_story.txt”;此外,当删除文件时,短名称将立即再次可用。
使用该文件创建短文件名。算法的工作原理如下(通常,但请参阅 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
/* e.g. 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,如果有d:\ stuff \ somefileelse.txt(“d:\ stuff \ somefi~1.txt”),移动文件的短名称将是somefi~2.txt)。似乎短名称仅在给定计算机上的给定目录中持久存在。
所以:短文件名将由文件系统生成,通常通过上面概述的方法生成。最好假设短文件名不是持久的,因为一台机器上的c:\ longfi~1.txt可能是“c:\ longfilename.txt”,而另一台机器上的c:\ longfi~1.txt可能是“c:\ longfish_story.txt”;此外,当删除文件时,短名称将立即再次可用。
如果我是你我会 决不 依赖任何版本的任何文件系统驱动程序(无论是微软的,不管是另一个操作系统),都要与它用来生成短文件名的算法保持一致。 Microsoft Fastfat和NTFS驱动程序的确切行为不是“正式”记录的(除了有些高级别的概述)因此不属于API合同的一部分。如果您更新驱动程序,今天有用的功能可能明天不起作用。
此外,绝对不要求短名称包含波浪号字符 - 例如,请参阅 这篇文章来自Raymond Chen。
在MSDN博客中有关于此主题的宝藏信息 - 例如:
此外,不要仅依赖于字母数字字符。看着那(这 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