Рекурсивный обход директорий
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Рекурсивный обход директорий Expand / Collapse
Автор
Сообщение
27.11.2006 1:44
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 04.03.2008 15:10
Сообщ.: 245, Visits: 2 673
Уважаемые Гуру, требуется ваша помошь.

Мне необходимо реализовать рекурсивный обход директорий,начиная с заданной.

У меня есть класс с следующими методами:

// Устанавливает рабочую директорию
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;


#else // #ifdef WIN32
}

Есть директория TEMP:

D:\TEMP/new/new3 и
D:\TEMP/new2

Так вот при запуске ProcessDir() получается вот что:

D:\TEMP/new
D:\TEMP/new/new3
D:\TEMP/new2/new3/new2

Как мне сделать так,что бы функция заработатала?

Заранее всем спасибо!

Сообщ. #908022
27.11.2006 13:15
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 09.07.2008 2:17
Сообщ.: 1 298, Visits: 12 500
ошибка в логике программы, текущую директорию для рекурсивной обработки лучше передавать в качестве параметра функции (так проще)

если вы все же хотите использовать SetDir( m_strInitialDir + '\\' + s_Dir.name );

то после обработки внутренней рекурсии необходимо сбросить текущую директорию в начальное значение

SetDir( m_strInitialDir );

но так как m_strInitialDir уже имеет новое значение, то предварительно это значение придется сохранить перед выполнением блока рекурсии :)

std:string strInitialDir = m_strInitialDir;
SetDir( m_strInitialDir + '\\' + s_Dir.name );

... вызов рекурсии ...

SetDir( strInitialDir );

С уважением,
Владимир
Сообщ. #908049
27.11.2006 13:19
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 09.07.2008 2:17
Сообщ.: 1 298, Visits: 12 500
Я бы сделал примерно вот так:

// Запускает обработку заданной (через 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
}

Сообщ. #908050
27.11.2006 16:41
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 04.03.2008 15:10
Сообщ.: 245, Visits: 2 673
Спасибо большое, очень выручили!
Сообщ. #908061
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 7:28