天天看点

不是所有的短文件名都包含有波浪符号

短文件名:特仑苏.txt = 特~1.txt

想起了一句话:不是所有的牛奶都叫特仑苏。

我想,大多数人都看到过Windows系统为长文件名自动生成的对应的短文件名。

不是所有的短文件名都包含有波浪符号

举个例子,如果有一个文件名为”Long name for file.txt”,则你可能会得到类似这样的短文件名”LONGNA~1.TXT”,如果系统发现这个短文件名存在很多重复的,则还会生成这样的名称:”LO18C9~1.TXT”。

从这个例子中,我们看到这些短文件名都有一个共同之处:它们都包含有波浪符号(~)。

你可能不知道的是

不是每个短文件名都包含有波浪符号。

每个文件系统都有自己的一套方法来实现短文件命名。Windows95独占式的使用”~n”实现短文件名。

算法类似于下图:

不是所有的短文件名都包含有波浪符号

WindowsNT则引入了一种名为”hexadecimal hash overflow”的技术来实现短文件名的生成。然而,有些系统,比如Novell,则采用简单的字符串截断的方式实现。例如,如果Novell系统中有一个长文件名”Long name for file.txt”,则Novell会将它截断为”LONGNAME.TXT”。

所以,请不要假设所有的短文件都会带有波浪符号,因为这并不是事实。

这也意味着,如果你发现一个文件名里没有包含波浪符号,你就想着可以跳过对GetLongFileName的调用,这可不行:因为你的这一优化在Novell网络上是无效的,是会掉坑里去的。

总结

最后