Ще одна часто виконувана з файлом операція — пошук файлів в заданому каталозі. Для організації пошуку і відбору файлів використовуються спеціальні процедури, а також структура, в якій зберігаються результати пошуку.
Безпосередньо для пошуку файлів використовуються функції FindFirst і FindNext.
Функція
function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;
знаходить перший файл, заданий повним маршрутом Path і параметрами Attr Властивість Attr може містити комбінацію наступних прапорів-значень:
· faReadOnly — тільки для читання;
· faDirectory — каталог;
· faHidden — прихований;
· faArchive — архівний;
· faSysFile — системний;
· faAnyFile — будь-який.
Якщо заданий файл знайдений, функція повертає 0, інакше — код помилки Windows. Параметри знайденого файлу повертаються в записи F типу TSearchRec.
Функція
function FindNext(var F: TSearchRec): Integer;
застосовується для повторного пошуку наступного файлу, що задовольняє критерію пошуку. При цьому використовуються ті параметри пошуку, які задані останнім викликом функції FindFirst. У разі вдалого пошуку повертається 0.
Для звільнення ресурсів, виділених для виконання пошуку, застосовується функція:
procedure FindClose(var F: TSearchRec);
Потоки
Для організації обміну даними в застосуваннях використовуються спеціальні об'єкти — потоки, які не тільки зберігають інформацію під час виконання застосування, але і надають розробникові набір стандартних властивостей і методів для управління даними.
Потоки — дуже вдалий засіб для уніфікації введення/виводу для різних носіїв. Потоками є спеціальні об'єкти-спадкоємці абстрактного класу Tstream. Сам Tstream "уміє" відкриватися, читати, писати, змінювати поточне положення і закриватися. Оскільки для різних носіїв ці речі відбуваються по-різному, конкретні аспекти реалізовані в його нащадках. Найчастіше використовуються потоки для роботи з файлами на диску і пам'яттю.
Багато класів VCL мають уніфіковані методи LoadFromstream і saveTostream, які забезпечують обмін даними з потоками. Від того, з яким фізичним носієм працює потік, залежить місце зберігання даних.
Базові класи TStream і THandleStream
У основі ієрархії класів потоків лежить клас TStream. Він забезпечує виконання основних операцій потоку безвідносно до реального носія інформації. Основними з них є читання і запис даних.
Клас TStream породжений безпосередньо від класу TObject.
Потоки також грають важливу роль в читанні/записі компонентів з файлів ресурсів (DFM). Велика група методів забезпечує взаємодію компоненту і потоку, читання властивостей компоненту з ресурсу і запис значень властивостей в ресурс.
Таблиця 3. Властивості і методи класу Tstream
Оголошення | Опис |
property Position: Longint; | Визначає поточну позицію в потоці |
property Size: Longint; | Визначає розмір потоку в байтах |
Отже, в основі операцій прочитування і запису даних в потоці лежать методи Read і Write. Саме вони викликаються для реального виконання операції усередині методів ReadBuffer І WriteBuffer, ReadComponent І WriteComponent. Оскільки клас TStream є абстрактним, то методи Read і Write також є абстрактними.
Для створення потоку використовується конструктор
constructor Create(AHandle: Integer);
у параметрі якого передається дескриптор. Згодом доступ до дескриптора здійснюється через властивість:
property Handle: Integer;
Клас TFileStream
Клас TFileStream дозволяє створити потік для роботи з файлами. При цьому потік працює з файлом без урахування типу що зберігаються в нім даних (див. вищий).
Повне ім'я файлу задається в параметрі FileName при створенні потоку:
constructor Createfconst FileName: string; Mode: Word);
Параметр Mode визначає режим роботи з файлом. Він складається з прапорів режиму відкриття:
· fmCreate — файл створюється;
· fmOpenRead — файл відкривається для читання;
· fmOpenWrite — файл відкривається для запису;
· fmOpenReadWrite — файл відкривається для читання і запису.
Клас TMemoryStream
Клас TMemoryStream забезпечує збереження даних в адресному просторі. При цьому методи доступу до цих даних залишаються тими ж, що і при роботі з файловими потоками. Це дозволяє використовувати адресний простір для зберігання проміжних результатів роботи програми, а також за допомогою стандартних методів здійснювати обмін даними між пам'яттю і іншими фізичними носіями.
Властивість
property Memory: Pointer;
визначає область пам'яті, відведену для зберігання даних потоку. Зміна розміру відведеній пам'яті здійснюється методом
procedure SetSize(NewSize: Longint); override;
Для очищення пам'яті потоку використовується метод
procedure Clear;
Читання/запис даних в пам'ять виконується звичними методами Read і Write.
Також запис даних в пам'ять може здійснюватися методами:
· procedure LoadFromFile(const FileName: string); — з файлу;
· procedure LoadFromStream(Stream: TStream); — з іншого потоку.
Додатково можна використовувати методи запису даних у файл або потік:
procedure SaveToFile(const FileName: string);
procedure SaveToStream(Stream: TStream);
Клас TStringStream
Оскільки строкові константи і змінні широко застосовуються при розробці програм, то для зручності роботи з ними створений спеціальний клас TStringStream. Він забезпечує зберігання рядка і доступ до неї під час виконання застосування.
Він володіє стандартним для потоків набором властивостей і методів, додаючи до них ще декілька, що спрощують використання рядків.
Властивість тільки для читання
property DataString: string;
забезпечує доступ до рядка, що зберігається.
Методи
function Read(var Buffer; Count: Longint): Longint; override;
і
function Write(const Buffer; Count: Longint): Longint; override;
реалізують звичайний для потоків спосіб читання і запису рядка для довільної змінної Buffer.
Метод
function ReadString(Count: Longint): string;
забезпечує читання count байтів рядка потоку, починаючи з поточної позиції.
Метод
procedure WriteString(const AString: string);
дописує до рядка рядок AString, починаючи з поточної позиції.
При роботі з файлами і потоками використовуються додаткові класи виняткових ситуацій.
Контрольні запитання
1. Дати визначення типам файлів**
2. Як відбувається робота с файлами та каталогами.***
3. Дати визначення потокам**
4. Базові класи TStream і ThandleStream***
5. Який клас створює потік для роботи з файлами****
6. Що забезпечує клас TMemoryStream та його властивості***
7. З якою метою створений спеціальний клас TstringStream***
Література:
- Архангельский А.Я. Программирование в Delphi 7, М.,: ООО «Бином-Пресс», 2003 г. – 1152 с.
- Дарахвелидзе П. Г., Марков Е. П. Программирование в Delphi 7. — СПб.: БХВ-Петербург, 2003. — 784 с: ил.
- Колосов С.В. Программирование в среде Delphi., - Мн.: БГУИР, 2005, - 164 с.
- Иванова Г.С., Ничушкина Т.Н., Пугачев Е.К. Об'ектно-ориентированное программирование: Учеб. Для вузов / Под ред. Г.С.Ивановой. – М.: Изд-во МГТУ им. Н.Э.Баумана, 2001 – 320с.
- Пестриков В.М., Маслобоев А.Н., Delphi на примерах. – СПб.: БХВ – Петербург, 2005. 496 с.