Ошибки при поиске всех файлов на диске
Написал простейшую программку поиска всех файлов на диске, но не всегда она работает корректно. Поиск прерывается по неизвестной причине, и должного выхода из программы не происходит.
Поиск прерывается когда попадается папка с ограниченными правами доступа, при попытке войти с проводника пишет "Нет разрешений на доступ к этой папке". По каким атрибутам проверять такие папки чтобы обойти, и можно ли получить к ним доступ(очень желательно)?
Например находит папку с именем "Group - 0602537195633", В консоль выводит "Group ?- 0602537195633" очень много раз со знаком вопроса перед тире, после чего завершается. Такое было и на другом диске тоже поставил знак вопроса перед символом, что это такое?
Как узнать по какой причине произошла ошибка если ни на какие "cout-триггеры" не реагирует?
Еще слышал что проблемы могут возникнуть с длиной пути, у меня массив определен как "char LocalPath[MAX_PATH]" При копировании Windows иногда выдает что длинна пути слишком велика и прерывает копирование, зато файловые менеджеры как-то решают эту проблему, как?
Функции используемые в программе: FindFirstFile FindNextFile FindClose lstrcat lstrcmp
Ответы (1 шт):
- Иметь необходимые права
- Похоже на беды с Юникодом. Нужно использовать юникодные версии функций (настроить среду разработки (вы не указали, чем собираете)) или внаглую дописывать суффикс W -
FindFirstFileW. И с консолью общаться с помощьюwcout - WTF? Обработка ошибок подробно описана в статьях MSDN к функциям, которые вы используете. Стандартный паттерн - функция возвращяет состояние ошибки (это может быть и
NULL,FALSEи не-ноль - читайте мануал), после чего вы вызываетеGetLastErrorи узнаете код ошибки. Его смысл можно посмотреть в том же MSDN (сюрприз, правда?), или преобразовать в текст с помощьюFormatMessage - Удивительно, но на эту тему есть многабукв в том же самом 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