Поиск файлов с помощью Boost::filesystem

Тема в разделе "Общие вопросы по С и С++", создана пользователем -, 20 авг 2007.

Статус темы:
Закрыта.
  1. Гость

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

    Код (Text):
    bool FindFile( const boost::filesystem::path & dir_path,     // в этом каталоге,
    CString file_name, // искать такое имя,
    boost::filesystem::path & path_found )      // разместить путь здесь если удалось найти
    {

    CString sFileName;
    if ( !boost::filesystem::exists( dir_path ) ) return false; ////[b]Эта проверка в debuge выполняется[/b]
    boost::filesystem::directory_iterator end_itr;
    boost::filesystem::directory_iterator itr(dir_path); /////[b]exception здесь[/b]

    for (;itr != end_itr;++itr )
    {
    if (boost::filesystem::is_other(itr->status()))continue;
    wchar_t * pwsz;
    acutNewString(pwsz,1000);////Что начинается с acut - функции выделения памяти под строки
    mbstowcs(pwsz, itr->leaf().c_str(), 1000);
    sFileName.Append(pwsz);
    acutPrintf(_T("\n%s"),pwsz);
    acutDelString(pwsz);
    if ( boost::filesystem::is_directory( *itr ) )
    {

    if (FindFile( *itr, file_name, path_found ) ) return true;
    }
    else if ( 0==sFileName.Compare(file_name) )
    {
    path_found = *itr;
    return true;
    }
    }
    return false;
    }

    платформа VS2005, проект ObjectARX2007
     
  2. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    перехватываем исключение и выходим из функции с false. в чем сложность?
     
  3. Гость

    А как при этом я попаду на следующую директорию/файл? itr++ я сделать не могу. Да и с чем мне сравнивать исключение?
     
  4. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    на пальцах...

    boost::filesystem::directory_iterator itr(dir_path) создает итератор на вложенные элементы директории. Если к деректории нет доступами, логично что итератор создаться не может. В следующую директорию/файл ты попадешь за счет рекурсии.

    RTFM
     
  5. Гость

    Не понял (((

    У меня не создался itr, я не знаю itr++. Я знаю лишь путь к уже просмотренному файлу, который обрабатывался до встречи с закрытой папкой+ путь к самой папке. Я не знаю ни имя следующего файла в закрытой папке, ни имени соседней папки. Что передавать рекурсивно?
    либо: FindFile( oldPath, file_name, path_found ) - это уже проверили
    либо: FindFile( *olditr, file_name, path_found ) - то же самое
    либо: FindFile( NULL, file_name, path_found ) - не сработает

    Вы имеете в виду, что надо в глобальную переменную сохранять последний валидный itr и передавать что-то вроде: FindFile( validIter++++, file_name, path_found ) - частично сработает, за исключением случаев, когда мы самым первым шагом натыкаемся на закрытую папку?
     
  6. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    поэтому делаем return false;
     
  7. Гость

    И что это дает? Мы отказываемся от поиска в остальных папках диска, наткнувшись на закрытую?
     
  8. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    это вернет нас на предыдущий уровень рекурсии.
     
  9. Гость

    вот в этом и заключается мой вопрос, как с предыдущего уровня рекурсии перепрыгнуть тупиковую ветку и войти в другую?
     
  10. Гость

    а-а-а... понял ))). Действительно. Большое спасибо)
     
  11. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей