SHParseDisplayName завершается с ошибкой ERROR_FILE_NOT_FOUND, когда передается существующий каталог, имя которого заканчивается пробелом - PullRequest
0 голосов
/ 07 ноября 2019

Я разрабатываю приложение файлового менеджера и заметил, что некоторые функции не работают с существующей папкой, которая заканчивается символом пробела. Например"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.

1 Ответ

1 голос
/ 08 ноября 2019

Имена файлов и папок, начинающиеся или заканчивающиеся пробелом ASCII (0x20), будут сохранены без этих символов. Имена файлов и папок, заканчивающиеся символом ASCII Period (0x2E), также будут сохранены без этого символа. Все остальные конечные или начальные пробельные символы сохраняются.

Win32 API (CreateFile, FindFirstFile и т. Д.) Использует прямой метод для перечисления файлов и папок в локальной или удаленной файловой системе. Все файлы и папки могут быть обнаружены независимо от включения или расположения пробельных символов.

См. " Поддержка пробельных символов в именах файлов и папок "

И блог " MS-DOS также допускал пробелы в именах файлов, хотя очень немногие программы знали, как получить к ним доступ .

Так что для существующих файлов / папок с пробелом в конце имен, либоиспользуйте Win32 API (CreateFile, FindFirstFile и т. д.) или замените их новым именем без конечных или начальных пробельных символов.

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