2: TBegin := DateTimeToFileDate(Date - DaysInMonth(Date)); 3: TBegin := DateTimeToFileDate(Date - DaysInYear(Date)); 4: if SR.Time > DateTimeToFileDate(DateTimePicker2.Date) then TBegin := SR.Time + 1000

else TBegin := DateTimeToFileDate(DateTimePickerl.Date);
end;
ladd := SR.Time >= TBegin;
end;

// проверка размера

if not CBSize.Checked then if ComboBoxl.Itemlndex = 0 then ladd := ladd and (SR.Size > (SpinEditl.Value shl 10)) else ladd := ladd and (SR.Size < (SpinEditl.Value shl 10)); if ladd then begin // занесение узла в дерево

NewNode := TreeViewl.Items.AddChild(PNode, SR.Name); // задание пиктограммы

NewNode.Imagelndex := 1;
NewNode.Selectedlndex := NewNode.Imagelndex;
end;
ires := FindNext(SR) end;

FindClose(SR); // завершение поиска файлов

if CBInclude.Checked then begin // начало поиска папок

ires := FindFirst('*.*', faDirectory, SR);

while ires = 0 do

begin

if (SR.Name <> '.') and (SR.Name <> '..') and ((SR.Attr and faDirectory) <> 0)

// рекуррентный вызов ViewDir

then ViewDir(SR.Name, PNode);
ires := FindNext(SR) end;
FindClose(SR);
end;

// возврат в предыдущий каталог

ChDir('..') ;
end;

Отличие от рассмотренного ранее кода заключается в следующем. Сначала в папке проводится поиск файлов, удовлетворяющих шаблону. Для этого первым параметром функции FindFirst задается этот шаблон, содержащийся в EFile-Name.Text. В поиск включены системные и невидимые файлы (атрибуты равны faHidden+faSysFile). Сам по себе этот поиск и проверка наложенных на файлы условий не отличается от рассмотренного ранее. А затем, если включен индикатор CBInclude, идет поиск всех папок и обычных файлов (шаблон "*.*" и атрибуты faDirectory). При этом с файлами ничего не делается, а для каждой папки осуществляется рекуррентный вызов ViewDir.

Подобный модуль может быть встроен в различные приложения, в которых надо показать пользователю размещение на диске файлов, связанных с какой-то темой, если, конечно, их имена задавались в соответствии с каким-то шаблоном. А саму процедуру поиска, убрав из нее все, связанное с деревом, можно использовать, например, для удаления с диска всех файлов с заданным шаблоном. Подобные процедуры нужны для зачистки мусора - удаления временных файлов. Ниже приведена такая процедура:

procedure EraseFiles(Temlate, Dir: string);
var SR: TSearchRec;
ires: integer;
CurDir: string;

F: File; begin

// запоминание текущего каталога

CurDir := GetCurrentDir; // смена каталога, чтобы не задавать полный путь к файлам

ChDir(Dir);

// начало поиска файлов, удовлетворяющих шаблону ires := FindFirst(Temlate, 0, SR) ; while ires = 0 do begin

AssignFile (F, SR.Name);
Erase(F);

ires := FindNext(SR) end; FindClose(SR); // завершение поиска файлов

// начало поиска папок ires := FindFirst('*.*', faDirectory, SR) ; while ires = 0 do begin

if (SR.Name <>
'.') and (SR.Name <>
'..') and ((SR.Attr and faDirectory) <>
0) // рекуррентный вызов EraseFiles then begin Dir := Dir + 'V + SR.Name;
EraseFiles(Temlate, Dir) ;
end;
ires := FindNext(SR) end;
FindClose(SR);

// возврат в текущий каталог

ChDir(CurDir) ;
end;

Если вызвать ее, например, оператором

EraseFiles('*.tmp', 'D:\TEMP');

то будут удалены все файлы с расширением Лтпр, содержащиеся в папке D:\TEMP и во всех вложенных папках.

10.6 Поиск файлов в каталогах || Оглавление || 10.6.3 Ускоренный поиск


⇐ Предыдущая страница|

Приемы программирования в Delphi на основе VCL



Новости за месяц

  • Май
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс