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

Кароче суть в том, что я не писал код. Алгоритмы пробовал на бумажке.А проблема- мне просто не написать функцию обхода дерева. Хотябы приведите просто вариант обхода дерева, любой, прямой или обратный. Рекурсивный или нет (лучше рекурсивный, я его лучше понимаю =))) ). ПЛИЗЗЗЗ...
Если описывать алгоритм словесно, тогда так:
findfirst(папка)
Если не найдено - выход
записать имя папки в TStrings
рекурсивно вызвать getdirs, указав в качестве ARoot только что найденную папку
пока в заданной папке можно найти другие:
находим следующую папку
записать имя папки в TStrings
рекурсивно вызвать getdirs, указав в качестве ARoot только что найденную папку
findfirst(папка)
Если не найдено - выход
записать имя папки в TStrings
рекурсивно вызвать getdirs, указав в качестве ARoot только что найденную папку
пока в заданной папке можно найти другие:
находим следующую папку
записать имя папки в TStrings
рекурсивно вызвать getdirs, указав в качестве ARoot только что найденную папку
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
А просто Dir "путь у каталогу" /S >spisok.txt не пройдет?
Dyt что ты имеешь ввиду? Мне всё равно куда писать список, главное чтоб он формировался...
Код: Выделить всё
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...
Имею ввиду команду DOS Dir - самый простой способ сделать список файлов. Вызывать ее наверно через WinExec.
т.е команда выглядит так dir c:\windows /s /b >c:\list.txt
по ней будет составлен список файлов в директории c:\windows в т.ч. во всех подкаталогах и помещен этот список будет в файл c:\list.txt
т.е команда выглядит так dir c:\windows /s /b >c:\list.txt
по ней будет составлен список файлов в директории c:\windows в т.ч. во всех подкаталогах и помещен этот список будет в файл c:\list.txt
LAngel спасибо ОГРОМНОЕ- это то, что надо!!! Спасибо!!!
Dyt кстати я об этом и не подумал, но тоже спасибо и, действительно, работает =))
Dyt кстати я об этом и не подумал, но тоже спасибо и, действительно, работает =))
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
LAngel, второй параметр в описанной функии GetDirs лишний. Зачем лищний раз забивать стэк всякой ненужно всячиной. Достаточно AList:TStrings объявить снаружи функции.
Dyt, Точнее так:
Требовался ведь список директорий, а не всего подряд.
Dyt, Точнее так:
Код: Выделить всё
dir c:\windows /s /b /ad >c:\list.txt
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.