Урок Delphi 7
Работа с файлами в Delphi

Поиск файлов в Delphi


Компоненты работающие с файлами
Классическая работа с файлами
Диалоги выбора файлов
Определение размера файла
Поиск файлов
Таблица функций






Уроки Delphi
  1.  Первая программа
  2.  Использование компонентов
  3.  События Delphi
  4.  Типы данных Delphi
  5.  Создание своих типов данных
  6.  Выражения и операторы
  7.  Работа с файлами в Delphi
  8.  Дополнительные формы
  9.  Подпрограммы в Delphi
  10. Исключительные ситуации
  11. Взаимодействие приложения с пользователем
  12. Указатели в Delphi
  13. Обзор компонентов
  14. Работа со строками
  15. Создание интерфейса
  16. Графика в Delphi
  17. Многопоточность в Delphi
  18. Динамическое создание
        компонентов
Поиск по сайту




 Это важно:
   Метод Application.ProcessMessages;

 Это полезно:
   Параметр Sender в обработчиках событий;










Бояться не надо



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

  1. Сначала находится первый файл, удовлетворяющий заданной маске. Этот поиск осуществляется с помощью функции
      function FindFirst(const Path: String; Attr: Integer; var F: TSearchRec): Integer;

    Параметр Path задаёт адрес каталога (директории), в котором производится поиск. Он должен завершаться маской имён искомых файлов, например:
      'C:\Temp\*.*', '*.txt'.
    Символ '*' означает любое количество допустимых в имени файла символов. Если необходимо указать, что символ должен быть только один, то в маске используется символ '?'. Например, маска a*.txt определяет текстовые файлы с именем любой длины начинающиеся на a, а маска a?.txt ограничивает длину имени файлов двумя символами. Если в маске описан только файл, то поиск осуществляется только в текущем каталоге.

    Параметр Attr содержит набор атрибутов, которые могут учитываться при отборе файлов:

    • faReadOnly = $01 - файл только для чтения;
    • faHidden = $02 - скрытый файл;
    • faSysFile = $04 - системный файл;
    • faVolumeID = $08 - метка диска;
    • faDirectory = $10 - каталог (директория);
    • faArchive = $20 - архивный файл;
    • faAnyFile = $3F - произвольный файл.

       Наименования этих атрибутов могут иметь различные имена в различных системах. Именно текое предупреждение выдаёт Delphi при попытке использовать эти имена. Поэтому лучше использовать не наименования, а значения. Однако, тогда возникают непонятки: попробуй догадайся впоследствии, что такое $02 или $08... Поэтому нужно вводить константы с сответствующими значениями, и проблем не будет.

       Эти атрибуты имеют значение отдельных битов в результирующем числе Attr. Для задания искомому файлу набора атрибутов их нужно просто просуммировать:
      Attr := faReadOnly + faSysFile + faHidden;
    Такой набор атрибутов заставит функцию искать только скрытые системные файлы с характеристикой "только для чтения".

    Результат поиска содержится в переменной F, имеющей тип TSearchRec:
      type TSearchRec = record
        Time: Integer;
        Size: Integer;
        Attr: Integer;
        Name: TFileName;
        ExcludeAttr: Integer;
        FindHandle: THandle;
        FindData: TWin32FindData;
      end;


    Наиболее важными среди полей этой записи являются:

    • Name - имя файла;
    • Size - Размер файла в байтах;
    • Time - время создания файла в формате DOS.

  2. Чтобы определить, имеет ли найденный файл нужный атрибут, используется поразрядное логическое умножение:
      if (F.Attr and faDyrectory)=F.Attr
        then S:='Это каталог';

    То есть, имеющая нужный атрибут переменная F.Attr при поразрядном логическом умножении на него не изменяется.

  3. Когда первый файл, удовлетворяющий условиям поиска, найден, вызывается функция
      function FindNext(var F: TSearchRec): Integer;

    Переменная F, в которой первая функция сохранила результат поиска, передаётся функции FindNext в качестве параметра. На основании записанной в неё информации будет продолжен поиск следующего подходящего файла.

  4. Процесс поиска завершается вызовом процедуры:
      procedure FindClose(var F: TSearchRec);

    Эта процедура освобождает память, которая была выделена системой для проведения процесса поиска.

   Функции FindFirst и FindNext возвращают значение 0, если при поиске не возникло ошибок и очередной файл был найден.

   Для примера рассмотрим простую программку, которая поизводит поиск всех файлов на диске C. В программе папка рассматривается как файл, внутрь поиск не лезет. Можно скачать архив с этой программой.

Процедура, производящая поиск файлов на диске C. Используется классическая схема поиска: сначала находится первый файл, удовлетворяющий условиям, для этого применяется метод FindFirst, затем остальные файлы находятся методом FindNext Поиск файлов на диске C:
procedure TForm1.Button1Click(Sender: TObject);
var FindFile: TSearchRec;
begin
//Первый этап поиска
if FindFirst('c:\*.*', faAnyFile, FindFile)=0 //Параметры функции задают поиск на диске с: любых файлов
  then begin
         SG.Cells[1, 0]:=' Имя файла'; //Инициация заголовка таблицы
         SG.Cells[2, 0]:=' Размер файла'; //Инициация заголовка таблицы
         SG.Cells[0, 1]:=' 1.'; //Найден первый файл
         SG.Cells[1, 1]:=FindFile.Name; //Записываем в таблицу имя найденного файла
         SG.Cells[2, 1]:=IntToStr(FindFile.Size); //Записываем в таблицу размер найденного файла
         SG.Visible:=True; //Если первый файл найден, показываем таблицу
         if (FindFile.Attr and faDirectory)=FindFile.Attr //Определяем, это каталог или нет
           then SG.Cells[1, 1]:=SG.Cells[1, 1]+' - каталог'; //Если найденный файл - каталог, помечаем
//Второй этап поиска
while FindNext(FindFile)=0 do //Ищем другие файлы на диске, пока не произойдёт ошибка поиска
  begin
    SG.RowCount:=SG.RowCount+1; //Добавляем строку в таблицу
    SG.Cells[0, SG.RowCount-1]:=' '+IntToStr(SG.RowCount-1)+'.'; //Присваиваем ей номер
    SG.Cells[1, SG.RowCount-1]:=FindFile.Name; //Записываем имя файла
    SG.Cells[2, SG.RowCount-1]:=IntToStr(FindFile.Size); //Записываем размер файла
    if (FindFile.Attr and faDirectory)=FindFile.Attr //Определяем каталог
      then SG.Cells[1, SG.RowCount-1]:=SG.Cells[1, SG.RowCount-1]+' - каталог'; //Помечаем каталог
  end;
//Третий, завершающий этап поиска
FindClose(FindFile); //Освобождаем память
       end;
end;


Предыдущий урок           В начало урока          Следующий урок  

Уроки Delphi начинающим







© 2023 Delphi-Manual.ru - Уроки Delphi начинающим с нуля