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

mqkwyuun  于 2023-11-21  发布在  Windows
关注(0)|答案(5)|浏览(237)

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

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

字符串
当我在命令提示符下运行 */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短名称的安装。
谢谢伙计们

wlzqhblo

wlzqhblo1#

如果我是你,我不会 * 依赖任何版本的任何文件系统驱动程序(不管是微软的,无论是另一个操作系统的)是一致的算法,它用来生成短文件名。确切的行为,微软的Fastfat和dfs驱动程序是没有“正式”的文件(除了作为有点高层次的概述)因此不是API合同的一部分。如果你更新驱动程序,今天起作用的东西明天可能就不起作用了。
此外,短名称绝对不需要包含波浪号字符-例如参见this post by Raymond Chen
在MSDN博客中可以找到关于此主题的大量信息-例如:

另外,不要只依赖于出现的数字字符。看看Linux VFAT driver,它说,例如,任何数字字母,数字和以下字符的组合都是有效的:$ %“”- @ { } ~!#()& _ ^。Linux VFAT driver将在兼容模式下运行,...

iugsix8n

iugsix8n2#

短文件名是与文件一起创建的。算法的工作原理是这样的(通常情况下,但请参阅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:\somefile1.txt”)移动到d:\stuff\somefilewithlongname.txt,如果有d:\stuff\somefileelse.txt(“d:\stuff\somefile1.txt”),则移动文件的短名称将是somefile2.txt)。似乎短名称仅在给定机器上的给定目录中持久。
于是:短文件名将由文件系统生成,通常通过上面概述的方法。最好假设短文件名不是持久的,因为在一台机器上c:\longfish_1.txt可能是“c:\longfilename.txt”,而在另一台机器上可能是“c:\longfish_story.txt”;此外,当文件被删除时,短名称立即再次可用。

mpbci0fu

mpbci0fu3#

我相信MSDOS将长名称和短名称之间的关联存储在每个目录文件中。
它不依赖于日期/时间。
如果您将文件移动到新目录中.这将重置Piskvor所提到的算法再次适用
在新目录中(移动后),您将获得:

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

字符串
即使alongfilename2.txt最初是第三个创建的。

daupos2t

daupos2t4#

This link说的是如何做到的。我猜在最近的版本中仍然是同样的想法。
在Windows 2000中,FAT和NTFS都使用Unicode字符集作为其名称,其中包含MS-DOS无法读取的几个禁用字符。要生成短的MS-DOS可读文件名,Windows 2000将从LFN中删除所有这些字符并删除所有空格。由于MS-DOS可读文件名只能有一个句点,Windows 2000还将删除文件名中所有多余的句点。接下来,Windows 2000会根据需要将文件名截断为六个字符,并附加一个波浪号(~)和一个数字。例如,每个不重复的文件名将附加~1。重复的文件名将以~2结尾,然后是~3,依此类推。在截断文件名之后,文件扩展名将被截断为三个或更少的字符。最后,当在命令行显示文件名时,Windows 2000将文件名和扩展名中的所有字符都转换为“”。

piztneat

piztneat5#

当文件由运行桑巴舞的网络服务器提供时,短名称由服务器生成,并且它们不遵循可预测的模式。
因此,假设您可以预测短名称的形式是不安全的。

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

字符串

相关问题