|  | 
 Поиск файлов в определеной директории 
| Не правда ли, знакомая ситуация? Необходимо сделать так, чтобы программа искала какой-либо файл... Все, хорошо, если у Вас для этого есть специальная компонента (кстати, не входящая в стандартный набор). А если ее нет? Здесь придется писать алгоритм поиска файла. 
 В Delphi существует две функции для поиска файлов. Это:
 function FindFirst(const Path: string; Attr: Integer;
 var F: TSearchRec): Integer;
 
 function FindNext(var F: TSearchRec): Integer;
 
 
 
 Разберемся, что же означают эти функции. Для начала возьмем первую - FindFirst. Разберемся сначала с переменными.
 Path
 Это переменная, как видно из названия, показывающая путь к директории, где будет производиться поиск файла. Кроме этого, в эту переменную входит также и имя файла (файлов), которые должны быть найдены. Причем, в названии файла можно пользоваться такими символами: * (звездочка) и ? (знак вопроса). Значения этих символов стандартны: знак вопроса - любой допустимый символ, звездочка - комбинация любых допустимых символов. Под допустимыми символами я понимаю символы, которые могут использоваться в операционной системе для обозначения имен файлов.
 
 Пример использования переменной Path:
 {поиск файлов с любым именем в корне диска C:}
 Path:='c:\*.*';
 
 {поиск файлов в директории E:\AUDIO с именем, которое
 начинается на song3, с расширением .wav}
 Path:='e:\audio\song3?.wav';
 
 
 
 Обратите внимание:
 Недопустимо использовать символы * и ? в названии директории. Эти символы могут использоваться только в имени файла.
 
 Attr
 Переменная задает тип файлов, которые будут найдены. Тип переменной - Integer. Чтобы не мучаться с запоминанием цифр, рекомендую Вам запомнить такие слова:
 faReadOnly - файлы, у которых установлен аттрибут "Только для чтения".
 faHidden - файлы, у которых установлен атрибут "Скрытые".
 faSysFile - файлы, у которых установлен атрибут "Системный".
 faArchive - файлы, у которых установлен атрибут "Архивный".
 faDirectory - директория. То есть поиск поддиректорий в директории.
 faAnyFile - любой файл (в том числе и faDirectory, и faVolumeID).
 
 Теперь с этими словами можно обращаться как с цифрами - складывать их и вычитать. Например:
 {поиск Скрытых и Системных файлов}
 Attr := faHidden + faSysFile;
 
 {поиск всех файлов, кроме файлов,
 имеющих атрибут "Только для чтения"}
 Attr := faAnyFile - faReadOnly;
 
 
 
 Однако учтите:
 При применении вычитания результат может получиться несколько неожиданным, поэтому им лучше не злоупотреблять.
 
 
 Теперь разберемся, что же выдает функция. Функция возвращает 0, если была выполнена успешно, или, в противном случае, код ошибки. Кроме того, если функция нашла файл, удовлетворяющий и условиям переменной Path, и условиям переменной Attr, то она записывает результат в переменную F (типа TSearchRec), которая, естественно, должна быть объявлена командой Var.
 
 Тип TSearchRec можно представить как:
 type TSearchRec = record
 Time: Integer;
 Size: Integer;
 Attr: Integer;
 name: TFileName;
 ExcludeAttr: Integer;
 FindHandle: THandle;
 FindData: TWin32FindData;
 end;
 
 
 
 Теперь разберемся, что означает функция FindNext.
 
 Если команда FindFirst нашла какой-либо файл, то, возможно, если имя файла задано с символами * и/или ?, есть еще один или несколько файлов, удовлетворяющих условию поиска. В этом случае и используется команда FindNext. Функция также возвращает 0, если была выполнена успешно, или, в противном случае, код ошибки. И также записывает данные в переменную F.
 
 Теперь, зная эти две команды, можно составить и алгоритм поиска заданного файла.
 
 Простейший алгоритм:
 var
 F: TSearchRec;
 Path: string;
 Attr: Integer;
 begin
 {Искать все файлы в заданной директории с расширение .wav}
 Path := 'e:\audio\album31\*.wav';
 {которые имеют атрибуты "Только для чтения" и "Архивный"}
 Attr := faReadOnly + faArchive;
 
 FindFirst(Path, Attr, F);
 
 {Если хотя бы один файл найден, то продолжить поиск}
 if F.name <> '' then
 begin
 ListBox1.Items.Add(F.name); {Добавление в TListBox имени найденного файла}
 while FindNext(F) = 0 do
 ListBox1.Items.Add(F.name);
 end;
 FindClose(F);
 end.
 
 
 
 Обратите внимание на процедуру FindClose. Она освобождает память, которую заняли функции FindFirst и FindNext.
 
 |  | Категория: DELPHI | Добавил: SeM (06.04.2011) |  | Просмотров: 1230 
| Рейтинг: 0.0/0 |  Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация  | Вход  ] |  |