| 
| 
 | Вопрос # 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™ (статус: Доктор наук), 4 января 2008, 23:14 [#1]: Цитата: найти все файлы по маске с подкаталогами по указанному пути 
 Забыл добавить. Чтобы найти файлы по маске, надо эту маску задать вместо "*.*" в строке
 
 
 Founded:= FindFirst(Path+'*.*', $3F, Rec); // Первый поиск Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Вадим К (статус: Академик), 5 января 2008, 02:13 [#2]:to min@y™! внимательно почитайте, что такое KOL и подумайте, почему ваш ответ по крайней мере "не в тему"
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | 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™ (статус: Доктор наук), 6 января 2008, 15:21 [#5]:Прошу прощения, я был неправ. Вчера и сегодня до этого момента у меня не было возможности сесть за комп и отписаться, поэтому я всё это время нервно потел и грыз ногти, ибо вспомнил, что паскалевские функции поиска файлов находятся в модуле SysUtils, который, естесвенно, в приложениях KOL не используется. 
 Удалите мой ответ.
 
 Большие куски больше вставлять не буду. Хотя у меня тоже не анлим, а всего лишь EDGE.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |