Атрибути файлу. Пошук файлу

Ще одна часто виконувана з файлом операція — пошук файлів в заданому каталозі. Для організації пошуку і відбору файлів використовуються спеціальні процедури, а також структура, в якій зберігаються результати пошуку.

Безпосередньо для пошуку файлів використовуються функції 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***

 

Література: