Робота з файлами в Delphi
Класична робота з файлами в Delphi
Технологія роботи з файлами в системі Delphi вимагає певного порядку дій:
- Перш за все файл повинен бути відкритий . Система стежить, щоб інші програми не заважали роботі з файлом . При цьому визначається, в якому режимі відкривається файл - для зміни або тільки зчитування інформації. Після відкриття файлу в програму повертається його ідентифікатор, який буде використовуватися для вказівки на цей файл у всіх процедурах обробки.
- Починається робота з файлом . Це можуть бути запис, зчитування, пошук і інші операції.
- Файл закривається. Тепер він знову доступний іншим додаткам без обмежень. Закриття файлу гарантує, що всі внесені зміни будуть збережені, так як для збільшення швидкості роботи змінні попередньо зберігаються в спеціальних буферах операційної системи.
У Delphi реалізовано кілька способів роботи з файлами . Познайомимося з класичним способом, пов'язаним з використанням файлових змінних . Файлова змінна вводиться для вказівки на файл. Робиться це за допомогою ключового слова File :
var F : File ;
Описана таким чином файлова змінна вважається Нетипізованою, і дозволяє працювати з файлами з невідомою структурою. Дані зчитуються і записуються побайтно блоками, розмір яких вказується при відкритті файлу, аж від 1 байта.
Але частіше використовуються файли, що складаються з послідовності однакових записів. Для опису такого файлу до попереднього опису додається вказівку типу записи:
var F : File of тип_запису ;
Як типу можуть використовуватися базові типи, або створюватися свої. Важливо тільки, щоб для типу був точно відомий фіксований розмір в байтах, тому, наприклад, тип String в чистому вигляді застосовуватися не може, а тільки у вигляді String [N] , як вказувалося на уроці Delphi 5.
Дані, прочитані з файлу або ті, що записуються в файл, містяться в звичайній змінній, яка повинна бути того ж типу, що й файлова. Тому спочатку в програмі спочатку описується потрібний тип, а потім вводиться дві змінні цього типу - файлову і звичайну:
Для текстових файлів окремо зазначимо, що тип файлової змінної в цьому випадку TextFile , а тип звичайної - String .
Для відкриття файлу потрібно вказати, де він розташований. Для цього файлова змінна повинна бути асоційована з потрібним файлом, який визначається його адресою. Адреса файлу може бути абсолютрою, із зазначенням диска і каталогів ( 'C: \ Мої документи \ Мої малюнки \ FileName.ini'), або відносною, тоді він створюється в папці з .exe файлом програми. Для завдання відносного адреси досить вказати ім'я файлу з потрібним розширенням. Робиться це оператором AssignFile:
AssignFile (SaveF, 'C: \ Мої документи \ Мої малюнки \ FileName.ini');
AssignFile (SaveF, 'FileName.ini');
Тепер файл повинен бути відкритий.
Відкриття файлу оператором Rewrite призведе до відтворення файлу заново , тобто існуючий файл буде без попередження знищений, і на його місці буде створено новий порожній файл заданого типу, готовий до запису даних. Якщо ж файлу не було, то він буде створений.
Відкриття файлу оператором Reset відкриє існуючий файл для зчитування або запису даних, і його показник буде встановлений на початок файлу :
Rewrite (SaveF);
Reset (SaveF);
Кожен з цих операторів може мати другий необов'язковий параметр, що має сенс для нетипізований файлів, і в якому зазначено довжину запису нетипізованого файлу в байтах:
Rewrite (SaveF, 1);
Reset (SaveF, 1);
Читання файлу проводиться оператором Read:
Read (SaveF, SaveV);
Запис в файл виробляється оператором Write:
Write (SaveF, SaveV);
При цьому читання і запис проводиться з поточної позиції вказівника, потім покажчик встановлюється на наступний запис. Можна перевірити, чи існує потрібний файл, оператором FileExists:
if FileExists ( 'FileName.ini')
then Read (SaveF, SaveV);
Примусово встановити покажчик на потрібну запис можна оператором Seek (SaveF, N) , де N - номер потрібного запису, який, як і майже все в програмуванні, відраховується від нуля:
Seek (SaveF, 49); - Установка показника на 50-й запис.
При послідовному читанні з файлу рано чи пізно буде досягнуто кінець файлу, і при подальшому читанні відбудеться помилка. Перевірити, чи не досягнуто кінець файлу, можна оператором EOF (абревіатура End Of File), який дорівнює true , якщо прочитаний останній запис і покажчик знаходиться в кінці файлу:
while (not EOF (SaveF)) do
Read (SaveF, SaveV );
Для текстових файлів замість Read і Write використовуються оператори Readln і Writeln , які вміють визначати кінець рядка.
Оператор Truncate (SaveF) дозволяє відсікти (стерти або, якщо хочете, видалити!) всі записи файлу, починаючи від поточної позиції вказівника, і до кінця файлу.
Наприкінці роботи з файлом його необхідно закрити. Це робиться оператором CloseFile (SaveF);
Тепер можна змінити програму з першої частини уроку, яка запам'ятовувала своє положення на екрані. Опис змінних опускається, він наведений на малюнку вище.
Створюємо обробник події Форми OnCreate наступного змісту:
procedure TForm1.FormCreate (Sender: TObject);
begin
AssignFile (SaveF, 'Init.ini');
if FileExists ( 'Init.ini') then
begin
Reset (SaveF);
Read (SaveF, SaveV);
Form1.Left: = SaveV.X;
Form1.Top: = SaveV.Y;
Form1.Caption: = SaveV.Caption; // Наші змінні додатково зберігають заголовок Форми!
End;
end;
Тепер необхідно створити обробник події OnClose:
procedure TForm1.FormClose (Sender: TObject; var Action: TCloseAction);
begin
Rewrite (SaveF); // Не треба перевіряти наявність файлу, створимо його заново!
SaveV.X: = Form1.Left;
SaveV.Y: = Form1.Top;
SaveV.Caption: = Form1.Caption;
Write (SaveF, SaveV);
CloseFile (SaveF) ;
end;
У даному випадку файл зчитується і записується туди, куди ми йому вказали. Але необхідно також вміти вибрати потрібний файл в працюючій програмі. Опис цього - в заключній частині уроку.