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

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
OTELLO
Сообщения: 59
Зарегистрирован: 11 дек 2004, 11:52
Откуда: Питеррр
Контактная информация:

Всем привет! Кароче такая проблема:
нужно, зная корневой каталог, создать список всех папок(всех вложенных и вложенных во вложенные ну и т.д.) входящих в него и записать его в TStrings. Ну типа функция
GetDirs(ARoot:STRING;AList:TStrings), а примерный вызов такой GetDirs('D:\Primer1',ListBox1.Items);. Я пробовал обход дерева, (и обычный и рекурсию), но почему-то мне не хватает мозгов довести до ума =)). Кароче ни как не сделать.
Может кто делал или кто может написать такой код- подскажите плиз! Заранее спасиба!..
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

имхо, гораздо продуктивнее привести свой вариант а народ будет ошибки искать, "буде таковые имеются" (с)
Изображение
OTELLO
Сообщения: 59
Зарегистрирован: 11 дек 2004, 11:52
Откуда: Питеррр
Контактная информация:

Кароче суть в том, что я не писал код. Алгоритмы пробовал на бумажке.А проблема- мне просто не написать функцию обхода дерева. Хотябы приведите просто вариант обхода дерева, любой, прямой или обратный. Рекурсивный или нет (лучше рекурсивный, я его лучше понимаю =))) ). ПЛИЗЗЗЗ...
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Если описывать алгоритм словесно, тогда так:
findfirst(папка)
Если не найдено - выход
записать имя папки в TStrings
рекурсивно вызвать getdirs, указав в качестве ARoot только что найденную папку
пока в заданной папке можно найти другие:
находим следующую папку
записать имя папки в TStrings
рекурсивно вызвать getdirs, указав в качестве ARoot только что найденную папку
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Dyt
Сообщения: 2
Зарегистрирован: 03 апр 2005, 06:33
Откуда: Красноярск

А просто Dir "путь у каталогу" /S >spisok.txt не пройдет?
OTELLO
Сообщения: 59
Зарегистрирован: 11 дек 2004, 11:52
Откуда: Питеррр
Контактная информация:

Dyt что ты имеешь ввиду? Мне всё равно куда писать список, главное чтоб он формировался...
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

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

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;
С уважением, Lost Angel...
Dyt
Сообщения: 2
Зарегистрирован: 03 апр 2005, 06:33
Откуда: Красноярск

Имею ввиду команду DOS Dir - самый простой способ сделать список файлов. Вызывать ее наверно через WinExec.
т.е команда выглядит так dir c:\windows /s /b >c:\list.txt
по ней будет составлен список файлов в директории c:\windows в т.ч. во всех подкаталогах и помещен этот список будет в файл c:\list.txt
OTELLO
Сообщения: 59
Зарегистрирован: 11 дек 2004, 11:52
Откуда: Питеррр
Контактная информация:

LAngel спасибо ОГРОМНОЕ- это то, что надо!!! Спасибо!!!
Dyt кстати я об этом и не подумал, но тоже спасибо и, действительно, работает =))
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

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

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

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

dir c:\windows /s /b /ad >c:\list.txt
Требовался ведь список директорий, а не всего подряд.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить