Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практика_Delphi.doc
Скачиваний:
11
Добавлен:
25.08.2019
Размер:
2.92 Mб
Скачать

Тема 8. Робота з файлами

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

Для копіювання файлів застосовується функція 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. Це рядковий тип з нулем, що завершується. У таку змінну можна занести рядок дуже великої довжини. Її розмір обмежується наявністю нульового байта в кінці. Теоретично така змінна може мати нескінченний розмір. На практиці вона обмежується розмірами пам'яті, що виділяється, для програми.

Перетворення звичайної строкової змінної, типу 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.LoadFromFile(Імя_файла); // завантаження

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

Все це завдяки властивості Lines, в якій зберігаються рядки. Але на практиці іноді необхідно прочитати тільки певний рядок або зробити операцію додавання рядка у вже існуючий файл.

Приклад обробки текстового файлу

procedureTForm1.Button1Click(Sender: TObject);

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

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

begin

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

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

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

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

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

begin

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

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

end;

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

begin

ReadLn(f,st); // читати з файлу рядок

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; // покажчик на текстовий файл

begin

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

{$I-}

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

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

begin {$I-}

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

{$I+}

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

begin

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

Exit; end; end;

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

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

Процедура 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;

Read(f,i); //зчитати з файлу значення

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;

begin

AssignFile(f,'pos.ini'); {$I-}

Rewrite(f); {$I+}

if IOResult<>0 then Exit;

Write(f,Form1.Top);

Write(f,Form1.Left);

Write(f,Form1.Width);

Write(f,Form1.Height);

CloseFile(f); end;

Ім'я файлу, в якому зберігаємо змінні стани вікна, вказані без шляху, просто pos.ini.

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

Робота з файлами Приклад «Вгадай число!» Програма використовує файл rezlt.txt для фіксування часу гри під час кожного запуску. Вікно рейтингу гри може показати наявні результати і, за бажанням користувача, видалити рядки, починаючи з 4-й позиції. Запис у файл проводиться з урахуванням сортування результатів за часом у порядку зростання.

Лістинг програми. Модуль unit1.pas unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, Mask, ExtCtrls; type TForm1 = class (TForm) Memo1: TMemo; bbOk: TBitBtn; bbCls: TBitBtn; Label1: TLabel; Ed: TEdit; Label2: TLabel; Timer1: TTimer;      procedure FormCreate (Sender: TObject);      procedure FormActivate (Sender: TObject);      procedure bbOkClick (Sender: TObject);      procedure Timer1Timer (Sender: TObject); private      (Private declarations)      x: integer;      t: LongInt;      s: string; public    (Public declarations)      max: integer; // значення передається другому формою додатка   end; var    Form1: TForm1; implementation uses Unit2; ($ R *. dfm) var f: TextFile; // оголошуємо файлову змінну nm, tm: Array [1 .. 1000] of String; // робочі масиви для зберігання інформації з файлу i: integer; procedure TForm1.FormCreate (Sender: TObject); begin     Form1.Color: = 10342143; // задаємо довільний колір формі     t: = 0;     repeat     s: = InputBox ( 'реєстрація', 'Введіть ім'я','');     if s ='' then ShowMessage ('зареєструйтеся');     until s <>'';     Timer1.Enabled: = false;     t: = 0;     Label2.Caption: = s +',';     Label1.Caption: = 'Введіть число:';     Randomize;

x: = Random (21);

AssignFile (f,'rezlt.txt'); //пов'язуємо файлову змінну Delphi з фізичним файлом Rezlt.txt розташов. в каталозі проекту reset (f); // відкриваємо файл для читання     max: = 0; // Підраховуємо кількість рядків у файлі     while not EoF (f) do begin      readln (f);      inc (max);           end; CloseFile (f); // Переводимо загальна кількість рядків у файлі на число попередніх гравців на кожного по 2      max: = max div 2; запису: ім'я та час гри end;

procedure TForm1.FormActivate (Sender: TObject); begin   Ed.SetFocus; end; procedure TForm1.bbOkClick (Sender: TObject); var msg: TModalResult;        y: integer;        t1, k: integer; begin     Timer1.Enabled: = True; // включаємо таймер (Палітра компонентів / System / Timer)     if Ed.Text ='' then begin     msg: = MessageDlg ( 'немає введення числа!', mtError, [mbCancel], 0);     Ed.SetFocus; end;     y: = StrToInt (Trim (Ed.Text));     Ed.Text :='';     Ed.SetFocus;     if y <x then Memo1.Lines.Add('x> '+ IntToStr (y));     if y> x then Memo1.Lines.Add ( 'x <' + IntToStr (y));   if y = x then    // Користувач вгадав число        begin           Timer1.Enabled: = false; / / зупиняємо таймер           memo1.Lines.Add (Ви вгадали! Час гри: '+ IntToStr (t) +' сек. ');           memo1.Lines.Add ( 'x =' + IntToStr (y)); AssignFile (f, 'rezlt.txt'); // Зчитуємо дані з файлу попередніх результатів у робочі масиви reset (f); for i: = 1 to max do begin       readln (f, nm [i]);       readln (f, tm [i]); end; CloseFile (f); i: = 1; // Вставляємо новий результат у відповідні масиви, з урахуванням сортування t1: = StrToInt (tm [1]); while (t> t1) and (i <= max) do begin inc (i); if i <= max then t1: = StrToInt (tm [i]); end;    max: = max 1;    k: = i;    for i: = max downto k +1 do begin    nm [i]: = nm [i-1];    tm [i]: = tm [i-1]; end;    nm [k]: = s;    tm [k]: = IntToStr (t);

AssignFile (f, 'rezlt.txt'); // Перезаписує файл результатів rewrite (f); // відкриваємо файл на запис for i: = 1 to max do begin      writeln (f, nm [i]);      writeln (f, tm [i]); end; CloseFile (f);               msg: = MessageDlg (s + ", ви вгадали! '+ # 10 # 13 'X =' + IntTostr (y) + # 10 # 13'Час ігри: '+ IntToStr (t) +' сек. '+ # 10 # 13'Хочите подивитися рейтинг гри? ', mtInformation, [mbOk, mbNo], 0); if msg = mrNo then Close; if msg = mrOk then form2.Show;        end; end; // Команди процедури виконується періодично з частотою властивості Interval таймера при значенні властивості Interval = 1000 (задаємо 1 раз в секунду) procedure TForm1.Timer1Timer (Sender: TObject); begin     inc (t); end; end. TTimer (таймер) - компонент Delphi, що відслідковує задані інтервали системного часу.   Розташована на вкладці System Палітри компонентів. Властивість Properties / Interval задає проміжок тимчасового відліку в мілісекундах - тік таймера. За замовчуванням відлік таймера: Interval дорівнює 1000 (1 секунда) Лістинг програми. Модуль unit2.pas - вікно результатів гри unit Unit2; interface uses    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type    TForm2 = class (TForm)      m1: TMemo;      m4: TMemo;      m2: TMemo;      m5: TMemo;      m3: TMemo;      m6: TMemo;      Label1: TLabel;      Label2: TLabel;      Button1: TButton;      Button2: TButton;      Label3: TLabel; procedure FormActivate (Sender: TObject); procedure Button1Click (Sender: TObject); procedure Button2Click (Sender: TObject); private      (Private declarations) public      (Public declarations)    end; var    Form2: TForm2; implementation uses Unit1; ($ R *. dfm) var f: TextFile; nm, tm: Array [1 .. 1000] of String; mx, i: integer; procedure TForm2.FormActivate (Sender: TObject); begin    Form2.Color: = 16702203; // фарбуємо форму в довільний колір    button1.SetFocus;    mx: = Form1.max; // передаємо змінну з першої форми    AssignFile (f, 'rezlt.txt');    reset (f); // зчитуємо з файлу перші три місця і записуємо в Memo    for i: = 1 to 3 do  begin          m1.Lines.Add (IntToStr (i));          readln (f, nm [i]);          m2.Lines.Add (nm [i]);          readln (f, tm [i]);          m3.Lines.Add (tm [i]);    end; // Запис в Memo інших результатів з файлу for i: = 4 to mx do begin         m4.Lines.Add (IntToStr (i));         readln (f, nm [i]);         m5.Lines.Add (nm [i]);         readln (f, tm [i]);         m6.Lines.Add (tm [i]); end;    CloseFile (f); // закриваємо файл end; procedure TForm2.Button1Click (Sender: TObject); begin     Form1.Close; / / закриття Form1 призводить до закриття всього програми end; procedure TForm2.Button2Click (Sender: TObject); // Очищення записів, починаючи з 4-й позиції begin     for i: = 4 to mx do

begin            nm [i ]:='';            tm [i ]:='';  end;

m4.Clear;      m5.Clear;     m6.Clear; AssignFile (f, 'rezlt.txt'); rewrite (f); for i: = 1 to 3 do begin          writeln (f, nm [i]);          writeln (f, tm [i]); end;    CloseFile (f); end; end.