Страница 1 из 1

Содаём список папок... Помогите плз!

Добавлено: 31 мар 2005, 14:03
OTELLO
Всем привет! Кароче такая проблема:
нужно, зная корневой каталог, создать список всех папок(всех вложенных и вложенных во вложенные ну и т.д.) входящих в него и записать его в TStrings. Ну типа функция
GetDirs(ARoot:STRING;AList:TStrings), а примерный вызов такой GetDirs('D:\Primer1',ListBox1.Items);. Я пробовал обход дерева, (и обычный и рекурсию), но почему-то мне не хватает мозгов довести до ума =)). Кароче ни как не сделать.
Может кто делал или кто может написать такой код- подскажите плиз! Заранее спасиба!..

Добавлено: 01 апр 2005, 11:05
Игорь Акопян
имхо, гораздо продуктивнее привести свой вариант а народ будет ошибки искать, "буде таковые имеются" (с)

Добавлено: 01 апр 2005, 17:19
OTELLO
Кароче суть в том, что я не писал код. Алгоритмы пробовал на бумажке.А проблема- мне просто не написать функцию обхода дерева. Хотябы приведите просто вариант обхода дерева, любой, прямой или обратный. Рекурсивный или нет (лучше рекурсивный, я его лучше понимаю =))) ). ПЛИЗЗЗЗ...

Добавлено: 02 апр 2005, 22:58
Хыиуду
Если описывать алгоритм словесно, тогда так:
findfirst(папка)
Если не найдено - выход
записать имя папки в TStrings
рекурсивно вызвать getdirs, указав в качестве ARoot только что найденную папку
пока в заданной папке можно найти другие:
находим следующую папку
записать имя папки в TStrings
рекурсивно вызвать getdirs, указав в качестве ARoot только что найденную папку

Добавлено: 03 апр 2005, 06:39
Dyt
А просто Dir "путь у каталогу" /S >spisok.txt не пройдет?

Добавлено: 03 апр 2005, 21:50
OTELLO
Dyt что ты имеешь ввиду? Мне всё равно куда писать список, главное чтоб он формировался...

Добавлено: 04 апр 2005, 08:49
LAngel

Код: Выделить всё

procedure GetDirs(ARoot:STRING;AList:TStrings);
Var
  F : TSearchRec;
begin
  if ARoot[Length(ARoot)] <> '\' then ARoot := ARoot + '\';
  if FindFirst(ARoot + '*.*', faDirectory, F) = 0 then
  repeat
    if (F.Attr and faDirectory) = F.Attr then
    if not ((F.Name = '.') or (F.Name = '..')) then
    begin
      AList.Add(F.Name);
      GetDirs(ARoot + F.Name, AList);
    end;
  until FindNext(F) <> 0;
  FindClose(F);
end;

Добавлено: 04 апр 2005, 17:48
Dyt
Имею ввиду команду DOS Dir - самый простой способ сделать список файлов. Вызывать ее наверно через WinExec.
т.е команда выглядит так dir c:\windows /s /b >c:\list.txt
по ней будет составлен список файлов в директории c:\windows в т.ч. во всех подкаталогах и помещен этот список будет в файл c:\list.txt

Добавлено: 05 апр 2005, 17:20
OTELLO
LAngel спасибо ОГРОМНОЕ- это то, что надо!!! Спасибо!!!
Dyt кстати я об этом и не подумал, но тоже спасибо и, действительно, работает =))

Добавлено: 06 апр 2005, 15:36
Romeo
LAngel, второй параметр в описанной функии GetDirs лишний. Зачем лищний раз забивать стэк всякой ненужно всячиной. Достаточно AList:TStrings объявить снаружи функции.

Dyt, Точнее так:

Код: Выделить всё

dir c:\windows /s /b /ad >c:\list.txt
Требовался ведь список директорий, а не всего подряд.