C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Список всех подкаталогов в директории
R@kot
  Отправлено: 27.01.2005, 01:13


Дежурный стрелочник

Группа: Участник
Сообщений: 32



Народ, если кто знает, подскажите, как получить список названий всех папок, существующих в каком-либо каталоге? А как получить список всех файлов? Кому не лень, ответьте smile.gif
olegenty
Отправлено: 27.01.2005, 08:40


Ветеран

Группа: Модератор
Сообщений: 2412



FindFirstFile/FindNextFile (WIN API)
только рекомендую использовать "W" версию, чтобы не заморачиваться относительно имён файлом, длиннее 255 символов.
Konstantine
Отправлено: 27.01.2005, 10:27


Мастер участка

Группа: Модератор
Сообщений: 545



а чтоб только директории выводило — то в параметрах поиска нада поставить атрибут директории (faDirectory)
Doga
Отправлено: 27.01.2005, 10:59


Мастер участка

Группа: Участник
Сообщений: 575



Ну тады и я чо нить скажу smile.gif


CODE

//Возвращает список подкаталогов (TStringList) в каталоге RootDir,
//или NULL если RootDir некоректный
//---------------------------------------------------------------------------
TStringList * __fastcall GetSubDirs(AnsiString RootDir)
{
 TStringList *Result = NULL;

 if (DirectoryExists(RootDir))
 {
   TSeachRec  sr;
   AnsiString  MaskNameString;

   Result = new TStringList();
   Result->Clear();
   Result->Append(RootDir);
   
   for (i = 0; i < Result->Count; i++)
   {
     //Корректировка пути(дабавлямс '\')
     Result->Strings[i] = NormalDir(Result->Strings[i]);

     //MaskNameString — енто будет строка с маской имени файла(вааще-то каталога)
     MaskNameString = Result->Strings[i] + "*.*";
     
     //Поиск всех подкаталогов в указанном каталоге
     for (int j = 0;;j++)
     {
       if (!j)
       {
         if (FindFirst(MaskNameString, faAnyFile, sr))
         {
           FindClose(sr);
           break;
         }
       }
       else
       {
         if (FindNext(sr))
         {
           FindClose(sr);
           break;
         }
       }

       //Добавлямс новый путь к списку (ежели енто каталог)
       if(sr.Attr&faDirectory)
       {
         if((sr.Name != ".") && (sr.Name != ".."))
         {
           Result->Append(Result->Strings[i] + sr.Name);
         }
       }
     }  
   }

   //Удаляем корневой каталог из списка подкаталогов
   Result->Delete(0);
 }
 
 
 return Result;
}
//---------------------------------------------------------------------------
R@kot
Отправлено: 29.01.2005, 01:57


Дежурный стрелочник

Группа: Участник
Сообщений: 32



Спасибо большое всем, кто не поленился ответить wink.gif !!!

Вернуться в Вопросы программирования в C++Builder