Как я могу получить текущий каталог с правильным написанием? - PullRequest
0 голосов
/ 03 ноября 2019

Я могу получить путь к текущему каталогу, используя GetCurrentDirectory(), но всегда кажется, что он наследует написание текущего каталога PowerShell. Например, предположим, у меня есть структура каталогов с именем Test\MyProgram на томе D:. Теперь, если я сделаю это в PowerShell:

 cd D:/test/myprogram
 ./myprogram

Тогда GetCurrentDirectory() вернет D:\test\myprogram в качестве текущего каталога, потому что это то, что я передал cd, но, как описано выше, это D:\Test\MyProgram вреальность.

Конечно, символы верхнего и нижнего регистра не имеют значения в Windows, но все же: Как я могу получить настоящее имя текущего каталога с правильным написанием?

Ответы [ 2 ]

2 голосов
/ 03 ноября 2019

только файловая система знает, как имена файлов хранятся внутри. так что единственный способ - открыть дескриптор пути и затем запросить файловую систему о пути. скажем через GetFinalPathNameByHandleW API. но обратите внимание - у вас вначале должен быть правильный путь, иначе вы не сможете открыть файл. поэтому я думаю, что обычно нет никакого смысла делать это

// here path returned by call GetCurrentDirectoryW

HANDLE hFile = CreateFileW(path, 0, 0, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);

if (hFile != INVALID_HANDLE_VALUE)
{
    if (PWSTR szFilePath = new WCHAR[MAXSHORT])
    {
        if (GetFinalPathNameByHandle(hFile, szFilePath, MAXSHORT, FILE_NAME_NORMALIZED))
        {
            DbgPrint("%S\n", szFilePath);
        }
        delete [] szFilePath;
    }
    CloseHandle(hFile);
}

и учтите, что мы можем использовать FILE_NAME_OPENED вместо FILE_NAME_NORMALIZED. разница здесь в том, что если мы используем FILE_NAME_NORMALIZED - GetFinalPathNameByHandleW делает дополнительный запрос к файловой системе - FileNormalizedNameInformation запрашивается. Этот информационный класс реализован в ReFS и NTFS файловых системах. Другие файловые системы возвращают STATUS_INVALID_DEVICE_REQUEST. если сказать true, я не знаю, когда FileNormalizedNameInformation вернет имя, отличное от FileNameInformation. так что на практике вызов с FILE_NAME_OPENED работает немного быстрее и дает тот же результат, что и FILE_NAME_NORMALIZED

0 голосов
/ 03 ноября 2019

Вызовите GetFileInformationByHandleEx, передав дескриптор файла и FileNameInfo в качестве аргумента FileInformationClass. Вам нужно будет сделать это для каждого компонента на вашем пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...