gpt4 book ai didi

windows - Windows 中如何生成短文件名?

转载 作者:行者123 更新时间:2023-12-05 08:19:04 28 4
gpt4 key购买 nike

我目前正在使用以下 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 使用以下短文件名 约定:

Cut the name to 6 characters (without extension)
Append the tilde (~)
Append an unsigned integer number which indicates the match index (starting with 1)
Append the original file extension

因此,文件名 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 在波浪号之前生成这样的“随机”前缀(如 RA23A6RA0CAE)?

最佳答案

Microsoft 没有对此进行记录,但维基百科有:

8.3 filename :

Although there is no compulsory algorithm for creating the 8.3 name from an LFN, Windows uses the following convention:

1.If the LFN is 8.3 uppercase, no LFN will be stored on disk at all.

  • Example: TEXTFILE.TXT

2.If the LFN is 8.3 mixed case, the LFN will store the mixed-case name, while the 8.3 name will be an uppercased version of it.

  • Example: TextFile.Txt becomes TEXTFILE.TXT.

3.If the filename contains characters not allowed in an 8.3 name (including space which was disallowed by convention though not by the APIs) or either part is too long, the name is stripped of invalid characters such as spaces and extra periods. Other characters such as + are changed to the underscore _, and uppercased. The stripped name is then truncated to the first 6 letters of its basename, followed by a tilde, followed by a single digit, followed by a period ., followed by the first 3 characters of the extension.

  • Example: TextFile1.Mine.txt becomes TEXTFI~1.TXT (or TEXTFI~2.TXT, should TEXTFI~1.TXT already exist). ver +1.2.text becomes VER_12~1.TEX.

4.Beginning with Windows 2000, if at least 4 files or folders already exist with the same initial 6 characters in their short names, the stripped LFN is instead truncated to the first 2 letters of the basename (or 1 if the basename has only 1 letter), followed by 4 hexadecimal digits derived from an undocumented hash of the filename, followed by a tilde, followed by a single digit, followed by a period ., followed by the first 3 characters of the extension.

  • Example: TextFile.Mine.txt becomes TE021F~1.TXT.

正如 Joey 所提到的,文件名的未记录哈希值reverse engineered .

关于windows - Windows 中如何生成短文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31526206/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com