我有一个包含这些文件的文件夹:
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短名称的安装.
多谢你们.
如果我是你,我永远不会依赖任何版本的任何文件系统驱动程序(无论是微软的,不管是另一个操作系统)来保持它用于生成短文件名的算法的一致性.Microsoft Fastfat和NTFS驱动程序的确切行为不是"正式"记录的(除了有些高级别的概述)因此不属于API合同的一部分.如果您更新驱动程序,今天可行的功能可能无法使用.
此外,绝对不要求短名称包含波形符号 - 例如,请参阅Raymond Chen的这篇文章.
在MSDN博客中有关于此主题的宝藏信息 - 例如:
注册表项以强制Windows使用短文件名
NTFS好奇心(第一部分):短文件名
此外,不要仅依赖于字母数字字符.查看Linux VFAT驱动程序,例如,大写字母,数字和以下字符的任何组合都是有效的:$%'` - @ {}〜!#()&_ ^.NTFS将以兼容模式运行......
使用该文件创建短文件名.该算法的工作原理如下(通常,但请参阅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"; 此外,删除文件时,短名称将立即再次可用.