• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

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

Код:
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
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
перехватываем исключение и выходим из функции с false. в чем сложность?
 
G

Guest

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

Kmet

Well-known member
25.05.2006
904
8
BIT
0
на пальцах...

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

Да и с чем мне сравнивать исключение?
RTFM
 
G

Guest

Не понял (((

У меня не создался 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 ) - частично сработает, за исключением случаев, когда мы самым первым шагом натыкаемся на закрытую папку?
 
G

Guest

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

Kmet

Well-known member
25.05.2006
904
8
BIT
0
это вернет нас на предыдущий уровень рекурсии.
 
G

Guest

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

Guest

а-а-а... понял ))). Действительно. Большое спасибо)
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!