Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 253

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!

Как найти все файлы по маске с подкаталогами по указанному пути с помощью KOL?

Фамилия Имя Отчество Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Фамилия Имя Отчество (статус: Посетитель)
Вопрос отправлен: 4 января 2008, 13:44
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Emfs!
Так что вам мешало написать этот поиск? я не знаю. наверно только то, что это сможет сделать кто то за вас. ведь всё просто. у вас есть два варианта - воспользоваться АПИ фунциями - FindFirstFile, FindNextFile, FindClose, но прийдётся подружиться с PChar строками. но можно и готовыми функциями. они очень похожи на стандартные и являются обёртками над апи. В примере смотрите набросок, а остальное можно взять с готовых примеров поиска файлов, хоть они и под vcl. Ведь берём то идею

procedure FindFile;
   var F: TFindFileData;
begin
  if Find_First('*.*', f) then begin
    repeat
      //здесь работаем с найденным файлом
      //f.cFileName - имя найденного файла
    until not Find_Next(f);
  end;
  Find_Close(f);
end;

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 4 января 2008, 19:40

Ответ #2. Отвечает эксперт: min@y™

Всё гораздо проще и KOL тут абсолютно нипричём.
Когда-то давно, отвечая на подобном портале на аналогичный вопрос, мне пришлось написать пример - построение в TTreeView структуры заданного каталога с подкаталогами и файлами. Вот его главный модуль:

unit Main;
 
{$warn unit_platform off}
{$warn symbol_platform off}
 
interface
 
uses
  FileCtrl,
//==============================================================================
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, ImgList;
 
type
  TMainForm = class(TForm)
    StatusBar: TStatusBar;
    RefreshButton: TButton;
    Edit: TEdit;
    BrowseButton: TButton;
    TreeView: TTreeView;
    ImageList: TImageList;
    procedure BrowseButtonClick(Sender: TObject);
    procedure RefreshButtonClick(Sender: TObject);
    procedure TreeViewCompare(Sender: TObject; Node1, Node2: TTreeNode;
      Data: Integer; var Compare: Integer);
  private
    { Private declarations }
  public
    FFiles, FFolders: Integer;
    procedure MakeTree(const Path: string; ParentNode: TTreeNode);
    procedure RefreshStatus;
  end;
 
var
  MainForm: TMainForm;
 
implementation
 
{$R *.dfm}
 
procedure TMainForm.BrowseButtonClick(Sender: TObject);
var
  Dir: string;
begin
  if SelectDirectory('Выбирай папку', '', Dir)
    then Edit.Text:= IncludeTrailingPathDelimiter(Dir);
end;
 
procedure TMainForm.MakeTree(const Path: string; ParentNode: TTreeNode);
var
  Rec: TSearchRec;
  Founded: Integer;
  Node: TTreeNode;
begin
  {Картинки:
      Файл - 0,
      закрытая папка - 1,
      открытая - 2}
  StatusBar.Panels[2].Text:= 'Путь: ' + Path; // На StatusBar - текущий путь поиска
  Founded:= FindFirst(Path+'*.*', $3F, Rec); // Первый поиск
  try
    while Founded = 0 do // Выполняем, пока что-то найдено
      begin
        if (Rec.Name <> '.') and // Если дира - не корень диска
           (Rec.Name <> '..') and // и не родительская дира
           (Rec.Attr and faVolumeID = 0) // и не метка тома, то:
          then if Rec.Attr and faDirectory <> 0 // Если наткнулись на директорию
                 then begin
                        Node:= TreeView.Items.AddChild(ParentNode, Rec.Name);
                        Node.ImageIndex:= 1; // Присваиваем нужные картинки
                        Node.SelectedIndex:= 2;
                        Node.Data:= Pointer(1);// Единица соответствует директории (для сортировки)
                        Inc(FFolders); // Увеличиваем кол-во найденных директорий на 1.
                        // Запускаемся рекурсивно относительно найденной директории.
                        MakeTree(Path+Rec.Name+'\', Node);
                      end
                 else begin // Если наткнулись на файло
                        Node:= TreeView.Items.AddChild(ParentNode, Rec.Name);
                        Node.ImageIndex:= 0; // Присваиваем нужные картинки
                        Node.StateIndex:= 0;
                        Node.Data:= Pointer(0); // Ноль соответствует файлу (для сортировки).
                        Inc(FFiles); // Увеличиваем кол-во найденных файлов на 1.
                      end;
        RefreshStatus; // Обновляем StatusBar
        Founded:= FindNext(Rec); // Ищем след. файло/директорию
      end;
  finally
    FindClose(Rec); // Освобождаем ресурсы
  end;
end;
 
procedure TMainForm.RefreshButtonClick(Sender: TObject);
begin
  if DirectoryExists(Edit.Text)
    then begin
           FFiles:= 0;
           FFolders:= 0;
           TreeView.Items.BeginUpdate;
           TreeView.Items.Clear;
           Screen.Cursor:= crHourGlass;
           try
             MakeTree(Edit.Text, nil);
           finally
             TreeView.Items.EndUpdate;
             Screen.Cursor:= crDefault;
             RefreshStatus;
             StatusBar.Panels[2].Text:= 'Путь: ';
           end;
         end
    else Application.MessageBox(PChar('Путь не найден.'),PChar('Ошибка'),mb_Ok+mb_IconError);
end;
 
procedure TMainForm.RefreshStatus;
begin
  StatusBar.Panels[0].Text:= 'Файлов: ' + IntToStr(FFiles);
  StatusBar.Panels[1].Text:= 'Папок: ' + IntToStr(FFolders);
  Application.ProcessMessages;
end;
 
// Эта шняга нужна для правильной сортировки итемов TreeView.
// Каталоги - наверх, файлы - по алфавиту.
// За всё отвечает свойство Data каждого итема.
// Оно формируется при поиске в методе MakeTree.
 
// Для правильной сортировки TreeView в инспекторе объектов его свойство SortType
// установлено в значение stData.
procedure TMainForm.TreeViewCompare(Sender: TObject; Node1,
  Node2: TTreeNode; Data: Integer; var Compare: Integer);
begin
  Compare:= Integer(Node2.Data) - Integer(Node1.Data);
end;
 
end.

Весь проект прицепляю к ответу в файле.
К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 4 января 2008, 23:08


Мини-форум вопроса

Всего сообщений: 5; последнее сообщение — 6 января 2008, 15:21; участников в обсуждении: 2.
min@y™

min@y™ (статус: Доктор наук), 4 января 2008, 23:14 [#1]:

Цитата:

найти все файлы по маске с подкаталогами по указанному пути


Забыл добавить. Чтобы найти файлы по маске, надо эту маску задать вместо "*.*" в строке

Founded:= FindFirst(Path+'*.*', $3F, Rec); // Первый поиск
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 5 января 2008, 02:13 [#2]:

to min@y™!
внимательно почитайте, что такое KOL и подумайте, почему ваш ответ по крайней мере "не в тему"
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 5 января 2008, 11:13 [#3]:

А я знаю, что такое KOL, было время, что я им баловался. Я привёл пример готового приложения на VCL, потому что код был в наличии. Из процедуры поиска можно выкинуть всё, что касается VCL. Я просто хотел показать, как польлзоваться функциями поиска файлов FindFirst(), FindNext(), FindClose().
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 5 января 2008, 14:27 [#4]:

Несомненно, в вашем примере есть полезный код, но в процентном выражении - наверно 5-7%. Человеку надо ещё напрячся, что бы вытянуть оттудова крупицу данных.
И ещё одно. Такие куски кода рекомендовано вставлять в приложение. Не все люди имеют анлимитный интернет и платят за каждый байт реальные деньги. (Хорошо, хоть, что у меня анлим....)
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 6 января 2008, 15:21 [#5]:

Прошу прощения, я был неправ. Вчера и сегодня до этого момента у меня не было возможности сесть за комп и отписаться, поэтому я всё это время нервно потел и грыз ногти, ибо вспомнил, что паскалевские функции поиска файлов находятся в модуле SysUtils, который, естесвенно, в приложениях KOL не используется.

Удалите мой ответ.

Большие куски больше вставлять не буду. Хотя у меня тоже не анлим, а всего лишь EDGE.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:33
Выполнено за 0.04 сек.