Delphi файли. Класична робота з файлами в Delphi

Ми докладно розглянемо, як копіювати, видаляти, перейменовувати файли. Навчимося зчитувати та записувати інформацію до типізованих файлів.

Копіювання файлів за допомогою .

Для цього нам буде потрібно виклик всього однієї функції, яка виконує копіювання файлів. Це функція CopyFile(). Вона має три параметри, два з яких обов'язкові. Ось повний синтаксис.
CopyFile("шлях до початкового файлу","Шлях куди треба копіювати",Перезаписувати чи ні)

Приклад: CopyFile("D:sekretBD.txt", "C: ame.txt", true);

У першому параметрі можна вказувати не лише повний шляхдо файлу. Якщо вкажемо, наприклад, такий шлях "sekretBD.txt", то наша програма шукатиме цей файл у своєму каталозі. Ім'я та дозвіл потрібно вказувати саме такими, якими вони є у файлу, інакше програма просто не знайде файл.
У другому параметрі також можна вказувати відносний шляхі там ви можете вказати ім'я та розширення файлу таке, яке захочете. Тобто. за допомогою цієї функції можна робити і перейменування теж.
Третій параметр відповідає за перезаписування файлу. Якщо ми вкажемо true, файл не буде перезаписаний, а якщо false, то програма перезапише файл.

Перейменування файлів за допомогою

За перейменування файлів відповідає функція RenameFile(). Має 2 параметри. Ось її повний синтаксис
RenameFile("шлях до файлу","нове ім'я");
Чесно кажучи, синтаксис цієї функції мене не дуже тішить. У ньому теж у обох параметрах треба вказувати повний шлях. Тобто. якщо ми, наприклад, напишемо так

RenameFile("C:2.txt","3.txt");

То він скопіює файл у каталог програми. Тобто. виходить, що вона може виконувати роль копіювання теж. Це трохи дивно.

Видалення файлів за допомогою

Ну, тут все зовсім просто. Функція, за допомогою якої можна видалити файл, викликається так:

DeleteFile("C:myprofile.txt");

Єдине, що вона завжди 100% видаляє файл. Коли файл захищений, його не зможе видалити.

Робота з типізованими файлами в

Що таке типізований файл? Це файл із певною структурою. Зазвичай це структурою виступають записи та базові типи. Загалом, важливо, щоб тип був відомий фіксований розмірТому тип string застосовувати не можна, потрібно робити так: String[N].
Спочатку нам потрібно оголосити змінну, де зберігатимуться дані з файлу. Робиться це так:

Var f: file of<Тип>
Наприклад, f: file of string;

Потім потрібно з'єднатися з файлом. Для цього є команда AssignFile. Для виклику треба прописати два параметри, це змінна, яку ми оголосили вище та шлях до файлу. Наприклад

AssignFile(f,"C:delphi.ini");

Тепер потрібно відкрити файл. Можна відкрити двома способами: з перезатиранням та без. Метод Rewrite відкриває файл, заздалегідь створивши його. Тобто. якщо файлу у вказаному нами шляху перебуватиме, він створить. Якщо там вже був такий файл, то він буде видалений і знову створиться чистий файл. Метод Reset відкриває файл і ставить покажчик на початок файла. Але цей метод небезпечний тим, що якщо файлу, вказаного в підключенні, немає, програма вилетить з помилкою. Так що для правильного застосуванняфункції Reset слід сказати компілятору про відключення помилок. Задається це директивою ($ I-) тобто. повний синтаксис функції resetбуде таким:

($I-)
Reset(f);
($I+)

Після цього треба перевірити, був відкритий файл чи ні. Це можна зробити за допомогою функції IOResult. Якщо вона не дорівнює нулю, то все вдало.
Повний синтаксис:

($I-)
Reset(f);
($I+)
If IOresult<>0 then<ваш код>

Також здійснити перевірку допоможе функція FileExists. У ній потрібно вказати шлях до файлу.
Для читання файлу служить функція Read(), в якій вказуються два параметри: змінна файлу і тип запису, у разі це string. Синтаксис:

Для запису у файл служить функція Write(), у якій вказуються такі два параметри: змінна файлу і тип записи, у разі це string. Синтаксис:

While not eof(f) do
Read(f,String);

Також є функція seek, за допомогою якої ми можемо перейти на цікавий для нас запис. Наприклад, нам потрібно звернутися до 20 записів і ми робимо так:

Ще є функція truncate, за допомогою якої ми можемо видалити всі записи файлу, починаючи з позиції покажчика. Позицію можна вказати за допомогою функції seek, хто не зрозумів.

Після виконання всіх операцій із файлом, необхідно його закрити за допомогою функції CloseFile(f);
От і все. На цьому урок закінчено. До зустрічі на сайті!

Урок 15. Робота з файлами

У цьому уроці розглянемо дуже важливу темуу програмуванні – робота з файлами.
Практично у будь-якій програмі потрібно копіювати, відкривати, змінювати, зберігати, іноді видаляти файли.

Як відомо, файли мають різні форматиі до них застосовуються різні програмидля обробки. Наприклад, файли малюнків BMP, текстові файли TXTі т.п. Файли мають різні імена та певне розширення, що має в середовищі MS-DOSмаксимально три символи. Якщо файл має розширення RAR, то користувач і операційна система знає, що це архіватор, причому windosw для обробки цього файлу застосовує засоби, зазначені в спеціальному розділіреєстру.

Копіювання файлів

Для копіювання файлів використовується функція CopyFile. Формат її такий:

CopyFile(Вихідний_файл,Записуваний_файл,Прапор_перезапису);

де: Вихідний_файл - повний шлях та назва файлу, який копіюється;

Файл-запис - повний шлях і назва файлу, куди копіюється вихідний файл;

Прапор_перезапису – буде чи ні перезаписаний файл, якщо такий вже існує (true – не буде, false – буде перезаписано).

CopyFile є функцією, яка повертає прапор успішної чи ні операції копіювання.

Наприклад, наступний рядок:

if not CopyFile("c:\command.com","c:\1.com",true) then ShowMessage("Помилка копіювання");

скопіює файл command.com у файл 1.com тільки в тому випадку, якщо останнього немає, інакше буде видаватися повідомлення про помилку копіювання.

Переміщення файлів

Для переміщення файлів використовується функція MoveFile. Вона має наступний формат:

MoveFile(Вихідний_файл,Записуваний_файл);

Її параметри аналогічні вищерозглянутій команді, за винятком відсутності прапора перезапису.

if not MoveFile("c:\1.com","c:\2.com") then ShowMessage("Помилка переміщення");

Перейменування файлів

Функція RenameFile

if not RenameFile("c:\2.com","c:\3.com") then ShowMessage("Помилка перейменування");

У всіх вищезазначених командах параметри вихідного та кінцевого файлумає тип PChar. Це рядковий типз нулем, що завершується. Можливо, ви раніше чули про такий формат рядкових даних. У таку змінну можна занести рядок дуже великої довжини. Її розмір обмежується наявністю нульового байта наприкінці. Теоретично така змінна може мати нескінченний розмір. Насправді вона обмежується розмірами виділеної пам'яті для програми (2Гб).

Перетворення звичайної рядковий змінний, типу Stringв PChar виконується функцією:

PChar(Строкова_змінна).

При цьому для команд файлових операційможливі поєднання рядків. Наприклад:

procedure TForm1.Button1Click(Sender: TObject);

Var InDir,OutDir:String; // оголошення рядкових змінних

begin

InDir:="c:\1"; // каталог вихідних файлів

OutDir:="c:\2"; // каталог файлів, що записуються

CopyFile(PChar(InDir+"1.txt"),PChar(OutDir+"1.txt"),false);

CopyFile(PChar(InDir+"2.txt"),PChar(OutDir+"2.txt"),false);

end;

Тут є операція з'єднання двох рядкових змінних.

В результаті цієї процедури буде копіювання файлів c:\1\1.txt і c:\1\2.txt до каталогу c:\2. Файли копіюються під тими самими іменами.

Видалення файлів

Функція DeleteFile

if not DeleteFile("c:\3.com") then ShowMessage("Помилка видалення");

Робота із текстовими файлами. Читання з текстового файлу

На минулих уроках ми як, у компоненті Memo процес завантаження та запису текстового файлу робився так:

Memo1.Lines.SaveToFile(Ім'я_файлу); // Збереження

Все це завдяки властивості Lines, в якій зберігаються рядки.

Наступний приклад обробки текстового файлу дуже нагадує аналогічну мовою Pascal.
Знаючі людиможуть відчути різницю, оскільки є деякі відмінності.

procedureTForm1.Button1Click(Sender: TObject);

Varf:TextFile; // оголошення файлової змінної

st: String; // рядкова змінна

begin

AssignFile(f,"c:\1.txt"); // Прив'язка назви файлу до файлової змінної

($I-) // відключення контролю помилок введення-виведення

Reset(f); // Відкриття файлу для читання

($I+) // включення контролю помилок введення-виводу

ifIOResult<>0 then// якщо є помилка відкриття, то

begin

ShowMessage("Помилка відкриття файлу C:\1.TXT");

Exit; // Вихід з процедури при помилці відкриття файлу

end;

While not EOF(f) do// поки що ні кінець файлуробити цикл:

begin

ShowMessage(st); // Виводити рядок користувачеві

end;

CloseFile(f); // Закрити файл

end;

Прокоментую деякі рядки цього прикладу.

Команда AssignFile здійснює прив'язку рядка шляху файлу до файлової змінної. Всі подальші операції з файловою змінною автоматично здійснюються з вказаним файлом. Щоб уникнути плутанини, вказуйте повний шлях до файлу.

($I-) та ($I+) є директивами компілятора, що в цьому місці відповідно слід відключити та включити контроль помилок введення-виведення. В даному випадку при невдалій спробі відкриття файлу c:\1.txt (файл відсутній або відкритий для запису іншою програмою) наша програма не видасть аварійної помилки та продовжить виконання цієї процедури. Ця властивість корисна для обробки всіх можливих випадківу роботі програми.

IOResult – змінна, яка зберігає код помилки останньої операції вводу-вывода. Якщо вона дорівнює нулю, то остання операція успішно виконана.

EOF(Файл) – функція, що повертає ознаку кінця файлу. Тобто. вона показує, досягнуто чи ні кінець відкритого файла.

ReadLn (Файл, Змінна) - процедура зчитування змінної з файлу. На відміну від команди Read зчитує рядок із символом перекладу рядка, що завершується, під кодами 13 і 10 (клавіша Enter).

CloseFile(Файл) – процедура закриття раніше відкритого файлу.

Робота із текстовими файлами. Запис до текстового файлу

Розглянемо приклад:

procedure TForm1.Button1Click(Sender: TObject);

Var f:TextFile; // покажчик на текстовий файл

AssignFile(f,"c:\1.txt"); // Прив'язка назви до змінної

Append(f); // відкрити файл для додавання

if IOResult<>0 then //якщо помилка відкриття (наприклад, файлу немає)

Rewrite(f); // Створити новий файл

if IOResult<>0 then // помилка створення файлу

ShowMessage("Помилка створення файлу C:\1.TXT");

WriteLn(f,"Привіт"); // запис у файл рядка із символами перекладу рядка

CloseFile(f); // Закрити файл

Процедура Append(Файл) відкриває файл для запису та встановлює покажчик запису на кінець файлу, тобто. всі рядки, що додаються до файлу, будуть записані в кінець файлу.

У нашому випадку на початку файлу 1.txt може не опинитися на диску, тому команда відкриття файлу для додавання викличе помилку. У цьому випадку спрацьовує наш контроль помилок і виконується команда створення файлу.

Запис та читання з файлу не текстових даних

Розглянемо приклад, в якому програма при виході зберігає свої розміри та положення вікна на екрані у файл та при наступному запуску відновлює стан, що був при виході. Програма складається з двох процедур OnShow та OnClose для вікна Form1 програми.

procedure TForm1.FormShow(Sender: TObject);

Var f: file of Integer; // файлова змінна, тип integer

I:Integer; // Цілочиста змінна

begin

AssignFile(f, "pos.ini");

($I-)

Reset(f);

($I+)

if IOResult<>0 then Exit;

Form1.Top:=i; // верхнє положення вікна

Read(f,i);

Form1.Left:=i; // ліве положення вікна

Read(f,i);

Form1.Width:=i; // ширина вікна

Read(f,i);

Form1.Height:=i; // Висота вікна

CloseFile(f);

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

Var f: file of Integer;

Названа область пам'яті на зовнішньому носії(диску) називається файлом. Будь-який файл має ім'я. Інформація, яка зберігається у файлі, є безліччю елементів одного типу. Розмірфайлу, як правило, обмежений лише ємністю пристрою, на якому він зберігається, що дозволяє обробляти великі обсяги інформації.

Спосіб оголошенняфайлу залежить від його типу. Розрізняють три типи файлів:

текстові;

типізовані;

нетипізовані.

Текстовий файлскладається з послідовності будь-яких символів. Символи утворюють рядки, кожен із яких закінчується символом «кінець рядка». Кінець файлу позначається символом «кінець файлу». При записі інформації в текстовий файл всі дані перетворюються до символьного типу і зберігаються в такому вигляді. Переглянути текстовий файл можна за допомогою будь-якого текстового редактора.

Опис текстового файлу:

var ім'я_змінної: TextFile;

Типізований файлскладається з елементів одного типу, кількість яких заздалегідь не визначена і може бути будь-якою. Він також закінчується символом «кінець файлу». Дані в типізованому файлі зберігаються в двійкових кодахі не проглядаються текстовими редакторами. Оголошення таких файлів має вигляд:

имя_переменной: file of тип;

У нетипізованих файлахінформація зчитується та записується у вигляді блоківпевного розміру, можуть зберігатися дані будь-якого виду і структури. Опис нетипізованого файлу:

var ім'я_змінної: file;

Для доступу до файліввикористовують спеціальну файлову змінну.

Наприклад:

c:file of integer;

Для зв'язкуфайлової змінної з файлом на диску застосовують процедуру:

AssignFile(змінна, ім'я_файлу);

тут змінна – ім'я змінної будь-якого файлового типу, имя_файла – рядок символів, що містить повне ім'яфайлу (якщо шлях до файлу не вказано, мається на увазі, що він знаходиться в поточному каталозі).

Наприклад:

S:='text.txt';

assign (f,'d:\tp\tmp\abc.dat');

Для відкриття існуючого файлу використовують процедуру:

Reset(файлова_змінна);

Після відкриття файлу доступний перший компонент.

Для створення нового файлу або видалення інформації з існуючого застосовують процедуру:

Rewrite(файлова_змінна);

Після виконання різних операційфайл має бути закритий. Для цього застосовують процедуру

CloseFile(файлова_змінна);

Запис даниху текстовий файл здійснюється процедурами

Write (змінна, список_виразів);

Writeln (змінна, список_виразів);

де список_виразів – вирази символьного, цілісного, речового, рядкового або логічного типів, які будуть записані у файл, пов'язаний із файловою змінною.

Процедура Writeln наприкінці кожного рядка додає символ «закінчення рядка».

ПРИКЛАД. Підпрограма, що створює на диску Dфайл abc.txtі записує до нього таблицю множення.

var f:TextFile; i,j:byte;

assignFile(f,"d:\abc.txt");

for i:=2 to 9 do

for j:= 2 to 9 do

write(f,i,"*",j,"=",i*j," ");

Читання данихз файлу здійснюється послідовно від початку файлу процедурою

Readln (змінна, список_змінних);

тут у списку_змінних перераховуються змінні, в які будуть записані дані прочитані з файлу, пов'язаного з файловою змінною.

Процедура Readln після прочитання з файлу чергового елемента переходить до наступного рядка.

Звернення до наступної підпрограми призведе до того, що на формі у вікні редагування з'явиться текст із файлу D:\abc.txt:

procedure TForm1.Button1Click(Sender: TObject);

a:string; i:integer;

AssignFile(f1,"D:\abc.txt");

for i:=1 to 8 do

Memo1.Lines.Add(a);

Для типізованих файлів також застосовні процедури читанняі записи

Read (змінна, список_змінних);

Write (змінна, список_виразів);

тільки типи виразів під час запису та читання повинні відповідати оголошеному типу файлу. Процедури Writeln та Readln до типізованих файлів не застосовують.

Для переміщення по типізованому файлувикористовують процедуру:

Seek(змінна, номер);

Ця процедура дозволяє перейти до елемента з вказаним номером, тобто здійснює прямий доступ до компонентів файлу. При прямому доступі компоненти файлу нумеруються від 0 до n-1, де n число компонентів у файлі.

Також для прямого доступу до компонентів типізованого файлу можна застосовувати функції:

filesize(змінна) – повертає кількість реальних компонентів у відкритому файлі, пов'язаному з файловою_змінною (для порожнього файлуфункція поверне 0);

filepos(змінна) – повертає значення поточної позиції у відкритому файлі, пов'язаному з файловою змінною (якщо файл щойно відкрився, то функція поверне нуль, після прочитання останнього компонента з файлу значення функції збігається зі значенням filesize, що вказує на досягнення кінця файлу).

Процедура Seek та функції filesize та filepos з текстовими файлами не працюють. Наступні підпрограми працюють як із типізованими, так і з текстовими файлами:

Rename (змінна, ім'я_файлу)

перейменовує закритий файл, пов'язаний з файловою змінною, відповідно до імені вказаного в рядку ім'я файлу;

Erase (змінна) – видаляє закритий файл, пов'язаний із файловою змінною;

Eof(змінна) приймає значення істина (true), якщо досягнуто кінець файлу, пов'язаного з файловою_змінною, і брехня (false) в іншому випадку;

ПРИКЛАД. Підпрограма, яка наведена нижче, працює так. Відкривається дійсний файл d:\abc.datі в нього записується певна кількість дійсних чисел, обчислених за формулою Переглянути створений файл неможливо, оскільки інформація в ньому представлена ​​в двійкових кодах.

procedure TForm1.Button1Click(Sender: TObject);

AssignFile(f,"d:\abc.dat");

n:=StrToInt(Edit1.Text);

for i:=1 to n do

a:= sqr(i)/sqrt(i);

Щоб переконатися, що запис у файл d:\abc.datвідбулася успішно, виведемо його значення у вікно редагування:

procedure TForm1.Button1Click(Sender: TObject);

f1:file of real;

AssignFile(f1,"D:\abc.dat");

while not eof (f1) do

Memo1.Lines.Add(FloatToStr(a));

ЗАВДАННЯ. На диску Еє файл цілих чисел аbc.int, поміняти місцями його максимальний та мінімальний елементи.

Наведена програма працює так. Компоненти файлу зчитуються до масиву. Елементи масиву виводяться у полі Memo1. Потім відбувається пошук мінімального та максимального елементів масиву та їх індексів. Максимальний та мінімальний компоненти перезаписуються у файл на відповідні позиції.

Наприкінці елементи перетвореного файлу виводяться у полі Memo2.

procedure TForm1.Button1Click(Sender: TObject);

f:file of integer;

a:array of integer;

i,nmax,nmin:byte; max,min:integer;

AssignFile(f,"e:\abc.int");

for i:=0 to filesize(f)-1 do

Memo1.Lines.Add(FloatToStr(a[i]));

max:=a; nmax:=0;

min:=a; nmin: = 0;

for i:=1 to filesize(f)-1 do

if a[i]>max then

if a[i]

for i:=0 to filesize(f)-1 do

Memo2.Lines.Add(FloatToStr(a[i]));

Файл- це іменована структура даних, що є послідовністю елементів даних одного типу розташованих на диску або будь-якому іншому зовнішньому носії.

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

Залежно від типу елементів розрізняють три види файлу:

– файл із елементів певного типу (типізовані файли);

– файл із елементів, тип яких не вказаний (нетипізований файл);

- Текстовий файл, тобто. Елементами є текстові рядки.

Для роботи з файлом у програмі оголошується файлова змінна (логічний файл) у розділі опису змінних:

ім'я файлу:fileof тип_елементів_файлів;

Файл, компонентами якого є дані символьного типу, називається символьним або текстовим:

ім'я файлу:TextFile;

Після оголошення файлової змінної, яка визначає тип компонентів файлу, необхідно вказати конкретний файл, тобто. зв'язати файлову змінну із фізичним файлом. Для цього використовується процедура:

AssignFile(varf, ім'я_файлу:String);

Функції та процедури для роботи з файлами:

1. Відкриття файлу для запису

– перезапис (запис нового файлу поверх існуючого або створення нового файлу) – використовується процедура

rewrite(файлова_змінна)

- Додавання в кінець файлу - використовується процедура

append(файлова_змінна)

1. Запис у файл

Write

Writeln(файлова_змінна, список_змінних)

Різниця між інструкціями в тому, що інструкція writeln після виведення всіх значень записує у файл символ «новий рядок».

2. Закриття файлу.Перед завершенням роботи всі відкриті файли необхідно закрити за допомогою процедури

CloseFile(файлова_змінна)

3. Відкривання файлу для читання.Використовується процедура Reset(файлова_змінна)

4. Читання даних із файлу

read(файлова_змінна, список_змінних)

readln(файлова_змінна, список_змінних)

Відмінність між цими процедурами полягає в тому, що при викликі інструкції readln покажчик читання з файлу автоматично переміщається на початок наступного рядка файлу.

5. Визначення кінця файлу.Використовується функція EOF(Файлова_змінна). Значення функції дорівнює false, якщо прочитаний елемент даних перестав бути останнім у файлі, тобто. можливе подальше читання. Якщо прочитаний елемент файлу останній, то значення EOF дорівнює true.

While not eof(f) begin … end;

6. Rename(var F; NewName: string)- Перейменовує невідкритий файл F будь-якого типу. Нове ім'я задається в NewName.

7. Seek( var F; NumRec: Longint)– встановлює позицію читання-запису на елемент із номером NumRec; F – типизований чи нетипізований файл.

8. IOResult: Inte g er – повертає код, що характеризує результат (була помилка чи ні) останньої операції введення-виведення.

9. FilePos(var F): Longint– повертає для файлу F поточну файлову позицію (номер елемента, яку вона встановлена, рахуючи від нуля). Не використовується із текстовими файлами.

10. FileSize(var F): Longint– повертає кількість компонентів у файлі F. Не використовується з текстовими файлами.

Для роботи з файлами можна використовувати такі візуальні компоненти:

– (SITELINK-S102)OpenDialog(/SITELINK);

– (SITELINK-S103)SaveDialog(/SITELINK) та інші, які знаходяться на вкладці Dialogs.

Створіть новий проект Delphi. Насамперед розробимо інтерфейс програми. Змінимо деякі властивості основної форми. Насамперед, надайте відповідне значення властивості Caption (заголовок форми) - наприклад, Робота з файлами. Оскільки вікно нашої програми має завжди знаходитися поверх решти всіх вікон, слід привласнити властивості FormStyle значення fsStayOnTop. Більше ніяких властивостей форми не змінюватимемо.

Розмістіть у лівому верхньому кутку форми, один над одним два компоненти Label (мітка) категорії Standard. Для верхньої мітки надайте властивості Caption значення Що:, а для другої - Куди:. Поруч із мітками розмістіть по одному компоненту Edit (поле введення) категорії Standard. Дайте властивості Name (ім'я) верхнього поля значення from, а властивості Name нижнього - значення where. Властивості from.Text і where.Text присвойте шляхи за замовчуванням, наприклад: c:\1.txt і d:\2.txt.

Для того щоб не турбувати користувача копіюванням або ручним введенням шляхів розміщення файлів, скористаємося стандартними діалоговими вікнами відкриття та збереження файлів. Діалогове вікно відкриття файлу відповідає компоненту OpenDialog категорії Dialogs, а діалоговому вікні збереження - компонент SaveDialog тієї ж категорії. Розмістимо ці компоненти формою. Для зручності змінимо значення якості OpenDialog1.Name на Open1, а значення якості SaveDialog1.Name на Save1.

Праворуч від полів from та where розмістимо кнопки виклику діалогового вікна огляду (компоненти Button категорії Standard). Властивості Caption цих кнопок надайте значення Огляд або просто поставте крапки. За бажанням, ви можете змінити розміри кнопок.

Розмістіть на формі під полем where компонент Label категорії Standardі надайте його властивості Caption значення Розмір файлу:. Праворуч від цієї мітки розмістіть ще один компонент Label, очистивши для неї властивість Caption - ця мітка буде відображати розмір файлу, що обробляється.

Нижче розмістимо дві кнопки (компоненти Button), надамо їх властивостям Caption значення Копіювати та Вирізати. Під цими кнопками розмістимо компоненти, які використовуватимуться для вибору та видалення файлів: компонент Edit для введення шляху до файлу, кнопка виклику діалогового вікна огляду та кнопка для видалення файлу.

Властивості Edit1.Name надамо значення Del, а властивості Text – шлях за замовчуванням. Кнопку Оглядрозмістимо праворуч, а кнопку Видалити файл- Під полем Del.

Отримана форма має відповідати рис. 2.1.

Мал. 2.1. Форма Робота з файлами

Розробка програмного коду

Розробимо процедуру копіювання файлу. Це можна було б реалізувати засобами WinAPI, однак у цьому випадку процедура, хоч і була б менш громіздкою, виявилася б "прив'язаною" до системи, що для програм небажано, тому краще скористатися бібліотеками Delphi.

Для початку оголосимо нашу процедуру (назвемо її doit) як закритий член класу форми:

Реалізацію процедури створимо у розділі implementation:

procedure TForm1.doit();
f1, f2: file of Byte;//Робота з першим та другим файлом
сміття: Byte;//Для побайтового копіювання
sizez: LongInt;//Зберігає розмір файлу
($I-)//Відключаємо директиву, яка відстежує помилки
try//Початок блоку обробки винятків
//Зв'язуємо файлову змінну f1 з першим файлом
AssignFile(f1, from.Text);
//Зв'язуємо файлову змінну f2 з другим файлом
AssignFile(f2, where.Text);
Reset(f1); // Відкриваємо перший файл для читання
sizez:= Trunc(FileSize(f1)); //Визначаємо розмір файлу
//Відображаємо розмір файлу для користувача
Label4.Caption:= IntToStr(sizez div 1024) + "Кб";
begin//Поки не досягнуто кінця першого файлу
//Зчитуємо один байт із першого файлу
BlockRead(fl, cop, 1);
//Записуємо один байт у другий файл
BlockWrite(f2, cop, 1);
CloseFile(f1); //Закриваємо перший файл
CloseFile(f2); //Закриваємо другий файл
end;//Кінець блоку обробки винятків
if IOResult<> 0 //Якщо виникла помилка введення-виводу
then MessageDlg("Помилка при копіюванні файлу!", mtError, ,0)//повідомлення про помилку
(Якщо помилок не було, то виводимо вікно про успішне закінчення копіювання)
ShowMessage("Успішно скопійовано!"");

⇘ Різні конструкції мови Object Pascal (коментарі, оператори розгалуження, обробка винятків та ін.) розглядаються у додатку Г.

Ця процедура буде використовуватися під час копіювання та перенесення файлів. Спочатку ми відкриваємо файли, які вибрав користувач, а потім перевіряємо, чи не було помилок під час їх відкриття. Якщо помилок не було, відображаємо користувачу розмір вихідного файлу і починаємо зчитувати байти з першого файлу, записуючи їх у другий. Якщо копіювання завершено і помилок при цьому не відбулося, відображаємо повідомлення про успішне закінчення копіювання.

Процедура doit викликається при натисканні кнопки Копіювати:

procedure TForm1.Button1Click(Sender: TObject);

Натискання кнопки Вирізатимає відбуватися звичайне копіювання з подальшим видаленням скопійованого файлу:

doit;//копіюємо
DeleteFile(from.Text); //Видаляємо вихідний файл

Тепер створимо процедури вибору та збереження файлу за допомогою стандартних діалогових вікон. Для вибору першого (вихідного) файлу слід створити наступний обробник події OnClick (кнопка Button2 відповідає поле from):

then from.Text:= Open1.FileName

При натисканні кнопки Оглядвідкривається діалогове вікно вибору файлу (Open1.Execute). Якщо в цьому вікні користувач натиснув кнопку Відміна(Open1.Execute = False), то повідомляємо йому про це і не виконуємо жодних дій. Якщо користувач вибрав файл, копіюємо шлях до нього у відповідне поле введення.

Створимо аналогічний обробник події для вибору шляху призначення під час копіювання першого файлу (кнопці Button3 відповідає поле where):

then where.Text:= Save1.FileName
else ShowMessage("Ви не вибрали місце для збереження файлу!");

Тут виконується та сама перевірка, що й у попередньому випадку. Потім обраний шлях заноситься у відповідне поле введення, щоб його, за бажанням, можна було скоригувати.

Тепер створимо аналогічний обробник події OnClick для кнопки Огляд, що використовується для вибору розміщення файлу, що видаляється:

then Del.Text:= Open1.FileName
else ShowMessage("Файл не був відкритий!");

Сама кнопка видалитивиконує при натисканні наступний код:

procedure TForm1.Button6Click(Sender: tobject);
DeleteFile(Del.Text);//Видаляємо файл
if not FileExists(Del.Text)//перевіряємо існування файлу
then ShowMessage("Файл видалений!");//виводимо повідомлення

Спочатку ми видаляємо файл, а потім перевіряємо, чи він на диску після виконання операції видалення. Якщо його не існує, то виводимо повідомлення про успішне видалення файлу. Тепер можна відкомпілювати та запустити програму на виконання. Зовнішній вигляд вікна Робота з файламиу дії показаний на рис. 2.2.

Мал. 2.2. Програма Робота з файлами у дії

Повний вихідний код модуля

Повний код модуля програми Робота з файлами представлена ​​у лістингу 2.1.

Лістинг 2.1. Модуль програми Робота з файлами
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ShellAPI, Gauges;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure doit; //Оголошення процедури doit


f1, f2: file of byte; //Робота з першим і другим файлом
сміття: byte; //для побайтового копіювання
sizez: longint; //Зберігає розмір файлу
(I-) (відключаємо директиву, яка стежить за помилками введення/виведення)
//зв'язуємо Файлову змінну f1 з першим файлом
//зв'язуємо файлову змінну f2 з другим файлом
Reset(f1); //відкриваємо перший файл для читання
sizez:= Trunc(FileSize(f1)); //Дізнаємо розмір файлу
//Відображаємо розмір файлу для користувача)
Label4.Caption:= IntToStr(sizez div 1024) + "Кб';
(Створюємо другий файл або перезаписуємо його, якщо він вже існує)
while not Eof(f1) do begin //поки не досягнуто кінця першого файлу
//зчитуємо один байт з першого файлу
//записуємо один байт у другий файл
CloseFile(f1);//закриваємо перший файл
CloseFile(f2); // закриваємо другий файл
if IOResult<>0 //Якщо виникла помилка введення-виводу
then MessageDlg("Помилка при копіюванні файлу!", mtError, , 0) //повідомлення про помилку
(якщо помилок не було, то виводимо вікно про успішне закінчення копіювання)
ShowMessage("Успішно скопійовано!");

procedure TForm1.ButtonlClick(Sender: TObject);

procedure TForm1.Button2Click(Sender: TObject);
if Open1.Execute then from.Text:= Open1.FileName
else ShowMessage("Файл не був відкритий");

procedure TForm1.Button3Click(Sender: TObject);
if Save1.Execute then where.Text:= Save1.FileName
else ShowMessage(""Ви не вибрали місце для збереження файлу!");

procedure TForm1.Button5Click(Sender: TObject);
DeleteFile(from.Text); //Видаляємо вихідний файл

procedure TForm1.Button4Click(Sender: TObject);
if Open1.Execute then del.Text:= Open1.FileName
else ShowMessage("Файл не було обрано");

procedure TForm1.Button6Click(Sender: TObject);
DeleteFile(del.Text); //Видаляємо файл
then //перевіряємо існування файлу
//виводимо повідомлення про успішне видалення
ShowMessage("Файл видалений!");

⊚ Усі файли проекту та виконуваний файл розглянутої програми знаходяться на доданому до книги компакт-диску в папці Chapter_02.