12

我有一个包含这些文件的文件夹:

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 短名称的安装。

多谢你们。

4

5 回答 5

9

如果我是你,我永远不会依赖任何文件系统驱动程序的任何版本(无论是微软的,还是其他操作系统的)来保持其用于生成短文件名的算法的一致性。Microsoft Fastfat 和 NTFS 驱动程序的确切行为没有“正式”记录(除了一些高级别的概述),因此不是 API 合同的一部分。如果您更新驱动程序,今天有效的方法明天可能无效。

此外,短名称绝对不需要包含波浪字符 - 例如,请参阅Raymond Chen 的这篇文章

在 MSDN 博客中可以找到有关此主题的大量信息 - 例如:

此外,不要依赖字母数字字符的唯一存在。查看Linux VFAT 驱动程序,例如,大写字母、数字和以下字符的任何组合都是有效的:$ % ' ` - @ { } ~ ! # ( ) & _ ^。NTFS 将在兼容模式下运行...

于 2008-11-27T15:51:40.833 回答
6

短文件名是随文件创建的。该算法的工作原理是这样的(通常,但请参阅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:\longfish_story.txt”;此外,当文件被删除时,短名称会立即再次可用。

于 2008-11-27T15:43:09.180 回答
3

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

它不取决于日期/时间。

如果您将文件移动到新目录中......这将重置 Piskvor 提到的算法再次应用

在新目录中(移动后),您将获得:

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

即使沿着文件名 2.txt 最初是第三个创建的。

于 2008-11-27T15:46:48.580 回答
0

这个链接说明了 NTFS 是如何做到的。我猜想在更新的版本上它仍然是相同的想法。

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

于 2008-11-27T15:47:16.693 回答
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
于 2011-06-24T17:32:37.300 回答