Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 43, средняя оценка - 4.91
PavelA
Сообщений: n/a
#1

Рекурсивный обход директорий - C++

27.11.2006, 04:44. Просмотров 5256. Ответов 3
Метки нет (Все метки)

Уважаемые Гуру, требуется ваша помошь.
Мне необходимо реализовать рекурсивный обход директорий,начиная с заданной.
У меня есть класс с следующими методами:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Устанавливает рабочую директорию
void CDirInfo::SetDir( std::string strInitialDir )
{
    m_strInitialDir = strInitialDir;
}
// Запускает обработку заданной (через SetDir) директории
int CDirInfo::ProcessDir( bool bRecursive /* = true  */ )
{
    cout << endl << "Dir: " << m_strInitialDir << endl;
    string strWildcard;
#ifdef WIN32
    //
    // WINDOWS FindFile routines
    //
    strWildcard = m_strInitialDir + "\*.*";
    _finddata_t s_Dir;
    intptr_t hDir;
    
    if( (hDir = _findfirst( strWildcard.c_str(), &s_Dir )) == -1L )
        return 1;
    do
    {
        if( s_Dir.name[ 0 ] != '.'  && ( s_Dir.attrib & _A_SUBDIR ) && bRecursive == true )
        {   
            SetDir( m_strInitialDir + '\ ' + s_Dir.name );
            ProcessDir( bRecursive );
        }
        else if ( s_Dir.name[ 0 ] != '.' )
           cout << endl << "File: " << s_Dir.name <<  endl;
    } while( _findnext( hDir, &s_Dir ) == 0 );
    _findclose( hDir );
    return 0;</P>
#else // #ifdef WIN32 
}
Есть директория TEMP:
D:TEMP/new/new3 и
D:TEMP/new2

Так вот при запуске ProcessDir() получается вот что:
D:TEMP/new
D:TEMP/new/new3
D:TEMP/new2/new3/new2
Как мне сделать так,что бы функция заработатала?
Заранее всем спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2006, 04:44     Рекурсивный обход директорий
Посмотрите здесь:

Рекурсивный обход каталога - C++
Здравствуйте. Стоит следующая задача. Необходимо выполнить рекурсивный обход директорий находящихся в корневом каталоге. При этом занести...

Рекурсивный обход двумерного массива - C++
Здравствуйте! Не могу составить алгоритм рекурсивного обхода двумерного массива. Например есть массив: 1 2 2 0 1 1 1 2 2 , выбираем...

Рекурсивный обход небинарного дерева - C++
Здравствуйте. бьюсь над задачей уже долго, но без помощи, чувствую, никак. Есть дерево, представлено этими двумя структурами. Нужно...

Рекурсивный обход НЕбинарного дерева - C++
Имеется функция, которая рекурсивно обходит одну папку. void GetFileList(LPTSTR sPath, Object* fsParser) { WIN32_FIND_DATA...

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

Рекурсивный обход дерева, не являющегося бинарным - C++
Пожскажите, пожалуйста, как организоват рекурсивный обход небинарного дерева...

Рекурсивный обход дерева папок и файлов - избавиться от бесконечного цикла - C++
Добрый день! Стоит задача рекурсивно обойти и сохранить имена папок и файлов в виде вектора. Моя рекурсивная функция работает не...

предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику - C++
Друзья! Ввиду возникшей необходимости мной был написан класс &quot;рекурсивный обход матрицы&quot;; Теперь задачи на такую тематику будут решаться...

Создание директорий - C++
Здорова господа!!! Мне нужно динамически создавать директории в виндовс, нашол функцию CreateDirectoryW(). Но она работает только...

Транслитерация названия директорий - C++
Задался вопросом написать функцию транслитерации названия директорий. Написал рекурсивную функцию перебора директорий, все работает. ...

Работа с деревом файлов/директорий - C++
Подскажите, пожалуйста, как преобразовать список из файлов и папок (гарантируется, что они описывают дерево с одним корнем - корневой...

Нужна помощь в создании/удалении директорий. - C++
Есть потребность в рабочей папке создать временную директорию, а по завершении всех необходимых работ удалить ее. В виду того что изучением...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
27.11.2006, 16:15     Рекурсивный обход директорий #2
ошибка в логике программы, текущую директорию для рекурсивной обработки лучше передавать в качестве параметра функции (так проще)

если вы все же хотите использовать
C++
1
SetDir( m_strInitialDir + '\ ' + s_Dir.name );
то после обработки внутренней рекурсии необходимо сбросить текущую директорию в начальное значение
C++
1
SetDir( m_strInitialDir );
но так как m_strInitialDir уже имеет новое значение, то предварительно это значение придется сохранить перед выполнением блока рекурсии
C++
1
2
3
4
std:string strInitialDir = m_strInitialDir;
SetDir( m_strInitialDir + '\ ' + s_Dir.name );
// ... вызов рекурсии ...
SetDir( strInitialDir );
С уважением,

Владимир
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
27.11.2006, 16:19     Рекурсивный обход директорий #3
Я бы сделал примерно вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// Запускает обработку заданной (через currentDir) директории
int CDirInfo::ProcessDir( std::string currentDir, bool bRecursive /* = true  */ )
{
    cout << endl << "Dir: " << currentDir << endl;
    string strWildcard;
#ifdef WIN32
    //
    // WINDOWS FindFile routines
    //
    strWildcard = currentDir + "\*.*";
    _finddata_t s_Dir;
    intptr_t hDir;
   
    if( (hDir = _findfirst( strWildcard.c_str(), &s_Dir )) == -1L )
        return 1;
    do
    {
        if( s_Dir.name[ 0 ] != '.'  && ( s_Dir.attrib & _A_SUBDIR ) && bRecursive == true )
        {
            ProcessDir( currentDir + '\ ' + s_Dir.name, bRecursive );
        }
        else if ( s_Dir.name[ 0 ] != '.' )
           cout << endl << "File: " << s_Dir.name <<  endl;
    } while( _findnext( hDir, &s_Dir ) == 0 );
    _findclose( hDir );
    return 0;
#else // #ifdef WIN32
}
PavelA
Сообщений: n/a
27.11.2006, 19:41     Рекурсивный обход директорий #4
Спасибо большое, очень выручили!
Yandex
Объявления
27.11.2006, 19:41     Рекурсивный обход директорий
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru