Работа с файлами
От: I_am_Foror  
Дата: 02.06.03 18:34
Оценка:
Нужно с помощью ф-ий WinAPI вычислить объем папки и кол-во вложенных в неё папок.

Может у кого есть уже по этому примеры? А то я чего-то запарился, рекурсия почему-то по всему дереву папок не пробегает...
Re: Работа с файлами
От: tyomchick Россия  
Дата: 02.06.03 19:44
Оценка:
Здравствуйте, I_am_Foror, Вы писали:

I__>Нужно с помощью ф-ий WinAPI вычислить объем папки и кол-во вложенных в неё папок.


I__>Может у кого есть уже по этому примеры? А то я чего-то запарился, рекурсия почему-то по всему дереву папок не пробегает...


А может ты её плохо покормил .
Если серьёзно, чё там может не пробегать. Задача элементарная, если фалл — плюсуешь размер, если папка — вызываешь для неё рекурсивно. Можт ты путь к папкам не так клеишь? Кинь код поправим, а с нуля писать влом.
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний
Re: Работа с файлами
От: free stranger Россия  
Дата: 03.06.03 06:50
Оценка:
Здравствуйте, I_am_Foror, Вы писали:

I__>Нужно с помощью ф-ий WinAPI вычислить объем папки и кол-во вложенных в неё папок.


I__>Может у кого есть уже по этому примеры? А то я чего-то запарился, рекурсия почему-то по всему дереву папок не пробегает...


Такое случается из-за того, что при рекурсивном переходе функции самой в себя ты забиваешь старые параметры поиска новыми, соответственно при выходе из функции ты оказываешься в тебе ненужном состоянии. Я эту проблему решал созданием класса поиска. Ниже примерный код (т.к. С++ не стоит буду писать "из головы", а посему, просьба не пинать )

class Finder
{
public:
    void ListOf(char *);
}

void Finder::ListOf(char *root, char *wildcard, HANDLE fHandle;)
{
   char path[MAX_PATH];
   char templ = "%s\\%s";
   WIN32_FIND_DATA ffdata
   HANDLE hFind;

   if( root )
   {
       sprintf(path, templ, root, wildcard);
       hFind = FindFirstFile( path, &ffdata );
   }
   else
   {
       hFind = fHandle;
   }

   while( FindNextFile(hFind, &ffdata) )
   {    
       if( ffdata.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY && ffdata.cFileName[0] !='.')
       {
           Finder *newFinder = new Finder;
           sprintf(path, templ, ffdata.cFileName, wildcard);
           newFinder->ListOf(NULL,  path, &ffdata );
           delete mewFinder;
        }
   }

   printf("Найдено: %s\n", ffdata.cFileName);
}


Ну в общем, что-то в этом роде. Конечно прийдется немного подравить по своим нуждам, да и ошибочки могут быть, но главное что идея понятна

С регардами.
The darkness around me
Shores of solar sea
Oh how i wish to go down with the sun....
Re: Работа с файлами
От: kam Россия  
Дата: 04.06.03 13:00
Оценка:
Здравствуйте, I_am_Foror, Вы писали:

Ну к примеру...

class CRecursiveFileEnumerator
{
  protected:

    virtual void Process ( const char * fullname, LPWIN32_FIND_DATA fd ) = 0;

  public:

    int Go ( const char * _file );

};

int CRecursiveFileEnumerator::Go ( const char * _file )
{
  WIN32_FIND_DATA FindFileData;
  char szFilePath [ MAX_PATH ];
  int bname;

  strcpy ( szFilePath, _file );
  if ( szFilePath [ strlen (szFilePath) - 1 ] != '\\' )
  {
    strcat ( szFilePath, "\\" );
  }

  bname = strlen ( szFilePath );
  strcat ( szFilePath, "*.*" );

  HANDLE hFind = ::FindFirstFile ( szFilePath, &FindFileData );
  if ( hFind != INVALID_HANDLE_VALUE )
  {
    do
    {
      strcpy ( szFilePath+bname, FindFileData.cFileName );

      if ( FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
      {

        if (    (0 != strcmp(FindFileData.cFileName,  ".") )
             && (0 != strcmp(FindFileData.cFileName, "..") )
           )
        {
          Process ( szFilePath, &FindFileData );
          Go ( (const char *) szFilePath );
        }
      }
      else
      {
        Process ( szFilePath, &FindFileData );
      }
    }
    while ( ::FindNextFile ( hFind, &FindFileData ) );
    ::FindClose ( hFind );

    return 0;
  }

  return 1;

}


Наследуешься от CRecursiveFileEnumerator, перегружаешь Process(), запускаешь Go(...)

--
BR, Kam
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.