Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Получение списка вложенных каталогов

Delphi , Файловая система , Директории

Получение списка вложенных каталогов

Автор: Samsonov Aleksandr
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Получение списка вложенных каталогов

Процедура служит ля получения списка каталогов вложенных в указанный каталог.
Полезно ее использовать для построения дерева каталогов.
Полученные в OutPaper данные можно передать процедуре
Радионова Алексейя которая по ним построит дерево.

Зависимости: sysutils, classes, StdCtrls, UDBF.FillTreeViewWithFiles
Автор:       Samsonov Aleksandr, s002156@mail.ru, Tver
Copyright:   s002156Shurik
Дата:        19 сентября 2002 г.
***************************************************** }

procedure GetTreeDirs(Root: string; OutPaper: TStringList);
var
  i: Integer;
  s: string;

  procedure InsDirs(s: string; ind: Integer; Path: string; OPaper: TStringList);
  var {Вставляет в Memo список вложенных директорий}
    sr: TSearchRec;
    attr: Integer;
  begin
    attr := 0;
    attr := faAnyFile;
    if DirectoryExists(Path) then
      if FindFirst(IncludeTrailingBackslash(Path) + '*.*', attr, SR) = 0 then
      begin
        repeat
          if (sr.Attr = faDirectory) and (sr.Name[Length(sr.Name)] <> '.') then
            OPaper.Insert(ind, s + sr.Name);
        until (FindNext(sr) <> 0);
        FindClose(SR);
      end
  end;

begin
  {Проверяем существуетли начальный каталог}
  if not DirectoryExists(Root) then
    exit;
  {Создаем список каталогов первой вложенности}
  if root[Length(Root)] <> '\' then
    InsDirs(root + '\', OutPaper.Count, Root, OutPaper)
  else
    InsDirs(root, OutPaper.Count, Root, OutPaper);
  i := 0;
  repeat
    s := OutPaper[i]; //в s получаем путь к уже внесенному в список кат.
    // Вставляем сразу за данной директорией в списке,
    // список вложенных в нее директорий.
    // Тем самым увеличиваем OutPaper.Lines.Count.
    // Таким образом катологи в которых поиск еще не производился,
    // оказываются ниже и очереь до них еще дойдет.
    InsDirs(s + '\', i + 1, OutPaper[i], OutPaper);
    inc(i);
  until (i = OutPaper.Count);
end;

Пример использования:

procedure TForm1.Button1Click(Sender: TObject);
var
  Strs: TStringList;
begin
  Strs := TStringList.Create;
  try
    GetTreeDirs('C:\', Strs);
    FillTreeViewWithFiles(TreeView1, Strs);
  finally
    Strs.Free;
  end;
end;

Переданный код Delphi - процедура GetTreeDirs, которая рекурсивно обходит указанную директорию и ее поддиректории для сбора списка директорий в виде TStringList. Полученный список можно использовать для заполнения контрола treeview, например.

Описание работы кода:

  1. Процедура GetTreeDirs принимает два параметра: Root, который является путем к директории, из которой начать обход, и OutPaper, который является TStringList, где будет храниться список директорий.
  2. Внутри процедуры она сначала проверяет, существует ли корневая директория с помощью функции DirectoryExists. Если она не существует, процедура сразу выходит из работы.
  3. Затем она вызывает другую процедуру, называемую InsDirs, для обхода директории и ее поддиректорий. Эта процедура рекурсивна, то есть она вызывает себя для обхода поддиректорий.
  4. Процедура InsDirs использует объект TSearchRec (sr) для поиска файлов и директорий в текущей директории. Затем она проверяет, является ли каждый найденный элемент директорие (то есть не файлом) и добавляет его имя в список OutPaper, если это не точка (.) или двойная точка (..). Это обеспечивает, что только поддиректории добавляются в список.
  5. Основной цикл процедуры GetTreeDirs перебирает список OutPaper, находит каждый директорий и вызывает InsDirs снова для обхода его поддиректорий.

Альтернативные решения:

Один из способов улучшить код - использовать цикл, чтобы перебрать директории в корневой директории, а затем рекурсивно вызвать GetTreeDirs для каждого поддиректория. Это бы избежало риска ошибок стека, которые могут возникнуть при глубоком рекурсивном вызове.

Пример:

procedure GetTreeDirs(Root: string; OutPaper: TStringList);
var
  i: Integer;
  s: string;
begin
  if not DirectoryExists(Root) then
    exit;

  for i := 0 to DirectoryCount(Root) - 1 do
  begin
    s := IncludeTrailingBackslash(Root) + GetDir(i);
    if DirectoryExists(s) then
      GetTreeDirs(s, OutPaper);
  end;
end;

Код использует функции DirectoryCount и GetDir из единицы SysUtils, чтобы перебрать директории в корневой директории. Затем он рекурсивно вызывает себя для каждого поддиректория.

Обратите внимание, что это альтернативное решение не обязательно более эффективно или лучше, чем оригинальный рекурсивный подход, но это другой способ достичь того же результата.

Процедура GetTreeDirs позволяет получить список вложенных каталогов в указанный каталог для последующего построения дерева каталогов.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Директории ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 12:23:56/0.0060248374938965/1