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

时间:2008-11-27 15:32:41

标签: windows file filesystems 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

精细。它似乎是根据我创建文件的日期/时间分配“〜#”。这是对的吗?

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

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

何时释放该ID(在本例中为~1)以用于另一个短名称。它会永远吗?

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

谢谢,伙计们。

5 个答案:

答案 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