Home > Mobile >  Why doesn't the "GetShortPathName" function sometimes gives me the short path?
Why doesn't the "GetShortPathName" function sometimes gives me the short path?

Time:06-10

I am trying to use the GetShortPathName() function to give me the short version of two paths, but it succeeds in only one path and fails in the other path.

// Get the game directory path
wchar_t GameDirPath[MAX_PATH] = L"\0";
GetCurrentDirectory(MAX_PATH, GameDirPath);

// Get the engine directory path
wchar_t EngineDirPath[MAX_PATH] = L"\0";
wcscat(EngineDirPath, GameDirPath);
wcscat(EngineDirPath, L"\\Assets\\Engine\\");

// Get the short path of the engine directory
wchar_t EngineShortPath[MAX_PATH] = L"\0";
GetShortPathName(EngineDirPath, EngineShortPath, MAX_PATH);

The following gives me the correct short path:

D:\Games\NEEDFO~1\Assets\Engine\

But this one doesn't:

D:\Games\FIFA 97\Assets\Engine\

Note that the two examples exist in the same folder "Games".


In short:
I want to pass the path to "DOSBox.exe" as a parameter but it doesn't accept the windows paths like this "D:\Games\FIFA 97\Assets\Engine", so you must convert it to a DOS path like this "D:\Games\FIFA97~1\Assets\Engine", so, I try to use the GetShortPathName() function to do that mission.


Why does this problem happen, and how can I solve it?

CodePudding user response:

As the documentation explicitly states:

If the specified path is already in its short form and conversion is not needed, the function simply copies the specified path to the buffer specified by the lpszShortPath parameter.

The API behaves as documented. There's nothing that needs to be fixed.

CodePudding user response:

Back to 90s, when DOS OS was largely used, files and directories names were limited to a maximum length of 8 characters (8.3 format; meaning 8 bytes for the file name and 3 for the file extension).

So hello.txt file was admitted, and helloguys.txt (9 chars log) was "illegal".

With Windows this limitation has beeen removed, and short names have been introduced in order to convert paths to DOS compliant format.


Now that we know what a short path is, we can analyze your case. In path

D:\Games\Fifa 97\Assets\Engine\

every token is DOS compliant. So what is the short version of this path? Well, the path itself. And that's why GetShortPathName( ) returns an unchanged path.

You can find a wide description in docs page.

  • Related