Я разрабатываю приложение файлового менеджера и заметил, что некоторые функции не работают с существующей папкой, которая заканчивается символом пробела. Например"E: \ 1 \". Это не относится только к этой конкретной папке, но на самом деле к любому с пробелом в качестве последнего символа имени папки. Для таких папок SHParseDisplayName
возвращает ERROR_FILE_NOT_FOUND
.
Я звоню SHParseDisplayName
, например, из C ++:
ITEMIDLIST* idPtr = nullptr;
const auto result = SHParseDisplayName(L"E:\\1 \\", nullptr, &idPtr, 0, nullptr);
В документации не указываются ни крайние случаи, ни способы, которыми вводпуть должен быть предварительно обработан. Несмотря на это, я попытался украсить его кавычками:
SHParseDisplayName(L"\"E:\\1 \\\"", nullptr, &idPtr, 0, nullptr);
и указав UNC-путь:
SHParseDisplayName(L"\\\\?\\E:\\1 \\", nullptr, &idPtr, 0, nullptr);
Оба из которых приводят к E_INVALIDARG
.
Примечания: SHParseDisplayName
работает правильно для элементов, вложенных в такую папку, например, L"E:\\1 \\some_internal_folder\\"
, но не для папки, имя которой заканчивается самим пробелом.
Есть ли обходной путь? Похоже, что Windows Explorer отлично работает с такими папками (как и следовало ожидать).
Кроме того, SHParseDisplayName
- не единственная функция Windows API, которая не работает для таких папок. Другой пример того же поведения - ILCreateFromPathW
.