|
|
|
Supreme 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 Как мне сделать так,что бы функция заработатала? Заранее всем спасибо!
|
|
|
|
|
Supreme Being
      
модератор
Last Login: 10.11.2008 0:08
Сообщ.: 1 298,
Visits: 12 501
|
|
ошибка в логике программы, текущую директорию для рекурсивной обработки лучше передавать в качестве параметра функции (так проще)
если вы все же хотите использовать SetDir( m_strInitialDir + '\\' + s_Dir.name );
то после обработки внутренней рекурсии необходимо сбросить текущую директорию в начальное значение
SetDir( m_strInitialDir );
но так как m_strInitialDir уже имеет новое значение, то предварительно это значение придется сохранить перед выполнением блока рекурсии :)
std:string strInitialDir = m_strInitialDir;
SetDir( m_strInitialDir + '\\' + s_Dir.name );
... вызов рекурсии ...
SetDir( strInitialDir );
С уважением,
Владимир
|
|
|
|
|
Supreme Being
      
модератор
Last Login: 10.11.2008 0:08
Сообщ.: 1 298,
Visits: 12 501
|
|
Я бы сделал примерно вот так:// Запускает обработку заданной (через 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 }
|
|
|
|
|
Supreme Being
      
участник
Last Login: 04.03.2008 15:10
Сообщ.: 245,
Visits: 2 673
|
|
| Спасибо большое, очень выручили!
|
|
|
|