Что происходит, когда «file_with_invalid_chars: <?>. Txt» передается в класс MFC CFile? - PullRequest
0 голосов
/ 05 апреля 2011

Примечание: Необходимо отредактировать заголовок и вопрос, так как изначально я думал, что проблема с ::CreateFile[W] - но, оказывается, ошибка возникает только в XP, когда я использую класс MFC Cfile.

Меня слегка смущает поведение CFile::Open(...) (на Win7 / 64bit), когда я передаю имя функции file_with_invalid_chars:<?>.txt этой функции, чтобы запросить создание файла.

На моей Windows XPв окне сбой вызова.

В моем окне Win7 / 64 вызов завершается успешно, создавая файл с именем file_with_invalid_chars.

Что происходит?

Ответы [ 2 ]

1 голос
/ 05 апреля 2011

Я предполагаю, что он создает альтернативный поток данных . Кажется странным, что на XP это не получится. В документации сказано, что символы, допустимые для имени файла, также допустимы для имени потока, хотя я предполагаю, что это не обязательно означает, что обратное верно. Возможно, Windows 7 поддерживает <и> в именах потоков, а Windows XP - нет.

0 голосов
/ 05 апреля 2011

Оказывается, это связано с ошибкой (?) В shlwapi.dll -

MFC CFile выполняет некоторую внутреннюю обработку имени файла и вызывает PathStripToRoot Функция .

Эта функция находится в Shlwapi.dll, и Win7 поставляется с более новой версией, чем Windows XP.

Версия в Windows XP, по-видимому, не работает правильно с file-пути, содержащие имена потоков, разделенных двоеточиями ADS.

Пример:

  • В XP PathStripToRoot(L"C:\\temp\\file.txt:stream"); возвращает строку C:\temp\file.txt:, которая является неправильной и приводит к ошибке, возвращаемой из CFile::Open
  • На Win7 тот же вызов возвращает фактический корень C:\.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...