我目前正在使用以下 P/Invoke 签名来获取常规 Windows 文件的短文件名:
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetShortPathName([MarshalAs(UnmanagedType.LPTStr)] string path,
[MarshalAs(UnmanagedType.LPTStr)] StringBuilder shortPath,
int shortPathLength);
目前 - 它工作没有任何问题,但我注意到一些相当奇怪的事情:
我知道 Windows 使用以下短文件名约定:
将名称剪切为 6 个字符(不带扩展名)
附加波浪号(~
)
附加一个表示匹配索引的无符号整数(从 1 开始)
附加原始文件扩展名
因此,文件名C:\abcdefghijklmn.txt
应该可以在短名称下访问C:\abcdefg~1.txt
。(这工作得很好。)
现在奇怪的部分:我最近在我的音乐目录中执行了一个小的搜索,以查找特定的音频文件。结果是这样的:
.\Rammstein & Tatu - Moscow.mp3
.\Rammstein - Asche zu Asche.mp3
.\Rammstein - Der Meister.mp3
.\Rammstein - Du Hast.mp3
.\Rammstein - Eifersucht.mp3
.\Rammstein - Feuer Frei.mp3
.\Rammstein - Führe Mich.mp3
.\Rammstein - Haifisch.mp3
...
并以简写形式进行相同的搜索:
.\RA8E17~1.MP3
.\RA23A6~1.MP3
.\RAMMST~1.MP3
.\RA0CAE~1.MP3
.\RAMMST~2.MP3
.\RAMMST~3.MP3
.\RAMMST~4.MP3
.\RA6BAA~1.MP3
...
我的问题是:为什么 Windows 会在波浪号(比如RA23A6
or RA0CAE
)之前生成这样的“随机”前缀?