c语言 - 为什么"GetShortPathName"函数有时不能给我短路径?



我试图使用GetShortPathName()函数给我两条路径的简短版本,但它只在一条路径上成功,在另一条路径上失败。

// Get the game directory path
wchar_t GameDirPath[MAX_PATH] = L"";
GetCurrentDirectory(MAX_PATH, GameDirPath);
// Get the engine directory path
wchar_t EngineDirPath[MAX_PATH] = L"";
wcscat(EngineDirPath, GameDirPath);
wcscat(EngineDirPath, L"\Assets\Engine\");
// Get the short path of the engine directory
wchar_t EngineShortPath[MAX_PATH] = L"";
GetShortPathName(EngineDirPath, EngineShortPath, MAX_PATH);

下面给出了正确的短路径:

D:GamesNEEDFO~1AssetsEngine

但是这个没有:

D:GamesFIFA 97AssetsEngine

请注意,这两个例子存在于同一个文件夹"Games"


简而言之:
我想将路径传递给"DOSBox.exe"作为参数,但它不接受这样的windows路径"D:GamesFIFA97 AssetsEngine",所以你必须将其转换为DOS路径"D:GamesFIFA97~1AssetsEngine",所以,我尝试使用GetShortPathName()函数来完成该任务。


为什么会出现这个问题,我该如何解决?

正如文档明确指出的:

如果指定的路径已经是其简写形式,并且不需要转换,则该函数只将指定的路径复制到lpszShortPath参数指定的缓冲区中。

API的行为与文档一样。没有什么需要修理的。

回到90年代,当DOS OS被广泛使用时,文件和目录名的最大长度被限制为8个字符(8.3格式;(文件名为8字节,扩展名为3字节)。

因此hello.txt文件被允许,而helloguys.txt(9个字符的日志)是"非法的"。

在Windows中,这个限制已经被移除,并且为了将路径转换为符合DOS的格式,引入了短名称。


现在我们知道什么是短路径,我们可以分析你的情况。在路径

D:GamesFifa 97AssetsEngine

每个令牌都是DOS兼容的。那么这个路径的版本是什么呢?路径本身。这就是为什么GetShortPathName( )返回一个未更改的路径。

你可以在文档页找到详细的描述。

最新更新