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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 43, средняя оценка - 4.91
PavelA
Сообщений: n/a
27.11.2006, 04:44     Рекурсивный обход директорий #1
Уважаемые Гуру, требуется ваша помошь.
Мне необходимо реализовать рекурсивный обход директорий,начиная с заданной.
У меня есть класс с следующими методами:
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++ Рекурсивный обход роботом плоской фигуры
Рекурсивный обход дерева, не являющегося бинарным C++
Рекурсивный обход каталога C++
C++ предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику
C++ Рекурсивный обход двумерного массива
C++ Работа с деревом файлов/директорий
Рекурсивный обход НЕбинарного дерева C++
Создание директорий C++
Рекурсивный обход дерева папок и файлов - избавиться от бесконечного цикла 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     Рекурсивный обход директорий
Ответ Создать тему
Опции темы

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