Ошибки при поиске всех файлов на диске

Написал простейшую программку поиска всех файлов на диске, но не всегда она работает корректно. Поиск прерывается по неизвестной причине, и должного выхода из программы не происходит.

  1. Поиск прерывается когда попадается папка с ограниченными правами доступа, при попытке войти с проводника пишет "Нет разрешений на доступ к этой папке". По каким атрибутам проверять такие папки чтобы обойти, и можно ли получить к ним доступ(очень желательно)?

  2. Например находит папку с именем "Group - 0602537195633", В консоль выводит "Group ?- 0602537195633" очень много раз со знаком вопроса перед тире, после чего завершается. Такое было и на другом диске тоже поставил знак вопроса перед символом, что это такое?

  3. Как узнать по какой причине произошла ошибка если ни на какие "cout-триггеры" не реагирует?

  4. Еще слышал что проблемы могут возникнуть с длиной пути, у меня массив определен как "char LocalPath[MAX_PATH]" При копировании Windows иногда выдает что длинна пути слишком велика и прерывает копирование, зато файловые менеджеры как-то решают эту проблему, как?

Функции используемые в программе: FindFirstFile FindNextFile FindClose lstrcat lstrcmp


Ответы (1 шт):

Автор решения: gbg
  1. Иметь необходимые права
  2. Похоже на беды с Юникодом. Нужно использовать юникодные версии функций (настроить среду разработки (вы не указали, чем собираете)) или внаглую дописывать суффикс W - FindFirstFileW. И с консолью общаться с помощью wcout
  3. WTF? Обработка ошибок подробно описана в статьях MSDN к функциям, которые вы используете. Стандартный паттерн - функция возвращяет состояние ошибки (это может быть и NULL, FALSE и не-ноль - читайте мануал), после чего вы вызываете GetLastError и узнаете код ошибки. Его смысл можно посмотреть в том же MSDN (сюрприз, правда?), или преобразовать в текст с помощью FormatMessage
  4. Удивительно, но на эту тему есть многабукв в том же самом MSDN

Вывод - При работе с API - принцип RTFM - это друг, товаришь и брат. Не пренебрегайте им, особенно если это API в исполнении M$.

Только никогда не читайте уродливый перевод, который M$ подсовывает, увидев русскую локаль в браузере:

Это функции управления файлами, которые больше не имеют ограничений на максимальную длину _ пути , если вы явно задействуете поведение пути: копифилев, CopyFile2, копифиликсв, креатефилев, CreateFile2, креатехардлинкв, креатесимболиклинкв, делетефилев, FindFirstFileW, FindFirstFileExW, FindNextFileW, GetFileAttributesW, GetFileAttributesExW, SetFileAttributesW, GetFullPathNameW, GetLongPathNameW, MoveFileW, MoveFileExW, MoveFileWithProgressW, ReplaceFileW, SearchPathW, FindFirstFileNameW, FindNextFileNameW.

Это - позорище. Избавиться от него можно, найдя в URL ru-ru и заменив него на en-us

→ Ссылка