我有一个包含这些文件的文件夹:
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短名称的安装。
谢谢,伙计们。
答案 0 :(得分:8)
如果我是你,我会从不依赖任何版本的任何文件系统驱动程序(无论是微软的,不管是另一个操作系统),都要对它用来生成短文件名的算法保持一致。 Microsoft Fastfat和NTFS驱动程序的确切行为不是“正式”记录的(除了有些高级别的概述)因此不属于API合同的一部分。如果您更新驱动程序,今天可行的功能可能无法使用。
此外,绝对不要求短名称包含波浪号字符 - 例如参见this post by Raymond Chen。
在MSDN博客中有关于此主题的宝藏信息 - 例如:
此外,不要仅依赖于字母数字字符。查看Linux VFAT driver,例如,大写字母,数字和以下字符的任何组合都是有效的:$%'` - @ {}〜! #()&amp; _ ^。 NTFS将以兼容模式运行......
答案 1 :(得分:5)
使用该文件创建短文件名。该算法的工作原理如下(通常,但请参阅moocha's reply):
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”;此外,当删除文件时,短名称将立即再次可用。
答案 2 :(得分:3)
我相信MSDOS会在每个目录文件中存储长名称和短名称之间的关联。
它不取决于日期/时间。
如果您将文件移动到新目录中...这将重置Piskvor提到的算法再次适用
在新目录中(移动后),您将获得:
ALONGF~1.TXT alongfilename1.txt
ALONGF~2.TXT alongfilename2.txt
ALONGF~3.TXT alongfilename3.txt
尽管最初创建了alongfilename2.txt第三个。
答案 3 :(得分:0)
This link说NTFS是如何做到的。我猜它在最近的版本中仍然是相同的想法。
在Windows 2000中,FAT和NTFS都使用 他们的Unicode字符集 名称,包含几个被禁止的 MS-DOS无法读取的字符。至 生成一个简短的MS-DOS可读文件 名称,Windows 2000删除所有 这些字符来自LFN和 删除任何空格。因为一个 MS-DOS可读文件名可以 只有一个时期,Windows 2000也是如此 删除所有额外的句号 文件名。接下来,Windows 2000 如有必要,截断文件名 六个字符并附加波浪号 (〜)和一个数字。例如,每个 附加了非重复文件名 与~1。重复的文件名结束 用~2,然后~3,依此类推。后 文件名被截断,即文件 名称扩展名被截断为三个 或更少的字符。最后,何时 在命令中显示文件名 行,Windows 2000翻译所有 文件名中的字符和 扩展为大写。
答案 4 :(得分:0)
当文件由运行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