|
Вопрос # 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. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|