Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Belova_TM

.pdf
Скачиваний:
56
Добавлен:
06.05.2015
Размер:
2.46 Mб
Скачать

Изучение работы с файлами в системе Delphi

191

var

F: File;

begin AssignFile(F,'myfile.dat'); Reset (F, 512);

end;

Длина записи нетипизированного файла указывается вторым параметром при обращении к процедурам Reset или Rewrite, в качестве которого может использоваться выражение типа LongInt. Если длина записи не указана, она принимается равной 128 байтам.

Object Pascal не накладывает каких-либо ограничений на длину записи нетипизированного файла, за исключением требования положительности и ограничения максимальной длины 2 Гбайт. Для обеспечения максимальной скорости обмена данными рекомендуется задавать длину, которая была бы кратна длине физического сектора дискового носителя информации (512 байт). Однако операции обмена данными с дисковыми устройствами в среде Windows обычно кэшируются, т.е. осуществляются через промежуточный буфер памяти, поэтому часто задают RecSize = 1, что позволяет обмениваться с файлом блоками любой длины, начиная с одного байта.

При работе с нетипизированными файлами могут применяться все процедуры и функции, доступные типизированным файлам, за исключением Read и Write, которые заменяются соответственно высокоскоростными процедурами BlockRead и BlockWrite:

procedure BlockRead (var F: File; var Buf; C: Integer [; var AmtTransferred: Integer] );

procedure BiockWrite(var F: File; var Buf; C: Integer [; var AmtTransferred: Integer]);

Здесь Buf − буфер: имя переменной, которая будет участвовать в обмене данными с дисками;

C − количество записей, которые должны быть прочитаны или записаны за одно обращение к диску;

AmtTransferred − необязательный параметр, содержащий при выходе из процедуры количество фактически обработанных записей.

За одно обращение к процедурам может быть передано до C*RecSize байт, где RecSize − длина записи нетипизированного

192

Изучение работы с файлами в системе Delphi

файла. Передача идет, начиная с первого байта переменной Buf. Программист должен позаботиться о том, чтобы длина внутреннего представления переменной Buf была достаточной для размещения всех C*RecSize байт при чтении информации с диска. Если при чтении указана переменная недостаточной длины или в процессе записи на диск не окажется нужного свободного пространства, возникнет ошибка ввода-вывода, которую можно заблокировать, указав необязательный параметр AmtTransferred.

После завершения процедуры указатель смещается на C записей. Процедурами Seek, FilePos и FileSize можно обеспечить доступ к любой записи нетипизированного файла.

Средства Windows для работы с файлами

Операционная система Windows имеет собственные средства работы с файлами (табл. 10.4), которые становятся доступны программе Delphi после ссылки на модуль Windows. Поскольку файловые средства Object Pascal реализуют подавляющее большинство программных запросов, в таблице 10.4 приводится лишь краткая информация о назначении соответствующих API-функций. За подробной информацией нужно обратиться к справочной службе.

 

Таблица 10.4

Средства Windows для работы с файлами

 

 

 

Процедура или функция

Пояснение

AreFileApisANSI

Определяет, будут ли файловые операции

 

 

использовать кодовую страницу ANSI

 

CopyFile

Копирует содержимое одного файла в другой

 

CreateDirectory

Создает новый каталог на диске

 

CreateDirectoryEx

Создает новый каталог на диске

 

CreateFile

Создает новый или открывает существую-

 

 

щий файл

 

CreateIoCompletionPort

Связывает асинхронный ввод/вывод файлом,

 

 

что дает возможность получить извещение о

 

 

завершении асинхронной операции

 

DefineDosDevice

Определяет, переопределяет или уничтожает

 

 

определение логического устройства MS-

 

 

DOS

 

DeleteFile

Уничтожает файл

 

FindClose

Освобождает память, выделенную функциям

 

 

FindFirstFile; FindNextFile

 

Изучение работы с файлами в системе Delphi

193

 

Продолжение табл. 10.4

 

 

 

Процедура или функция

Пояснение

 

 

 

FindCloseChange-

Освобождает память, выделенную функциям

Notification

FindFirstChangeNotification;

 

 

FindNextChangeNotification

 

FindFirstChange-

Требует от Windows известить программу об

Notification

изменении состояния каталога

 

FindFirstFile

Ищет первый файл из группы файлов

 

FindNextChange-

Требует от Windows известить программу об

Notification

очередном изменении состояния каталога

 

FindNextFile

Ищет следующий файл

 

FlushFileBuffers

Очищает файловый буфер

 

GetBinaryType

Определяет, является ли файл исполняемым

 

и, если является, возвращает его тип

 

GetCurrentDirectory

Возвращает умалчиваемый каталог

 

GetDiskFreeSpace

Возвращает свободное дисковое пространство

 

в байтах

 

GetDriveType

Возвращает тип диска (сменный, удаленный и

 

т.п.)

 

GetFileAttributes

Возвращает атрибуты файла

 

GetFiieInformationBy-Handle

Возвращает системную информацию о файле

GetFileSize

Возвращает размер файла в байтах

 

GetFileType

Возвращает тип файла

 

GetFullPathName

По короткому имени файла в формате MS-

 

 

DOS возвращает его полное имя в формате

 

 

Windows

 

GetLogicalDrives

Возвращает битовую 32-разрядную маску,

 

 

определяющую текущий диск

 

GetLogicalDrive-Strings

Возвращает список всех дисков, зарегистри-

 

рованных в Windows

 

GetQueuedCompietion-

Требует от Windows выполнения асинхронно-

Status

го ввода/вывода и приостанавливает работу

 

программы до завершения операций

 

GetShortPathName

Возвращает короткое имя файла в формате

 

 

MS-DOS

 

GetTempFileName

Возвращает уникальное имя файла для вре-

 

менного хранения данных

 

GetTempPath

Возвращает маршрут поиска каталога, пред-

 

назначенного для хранения временно исполь-

 

зуемых файлов

 

194

Изучение работы с файлами в системе Delphi

 

Окончание табл 10.4

Процедура или функция

Пояснение

 

 

GetVolumeInformation

Возвращает информацию о файловой подсис-

 

теме в целом и об указанном каталоге

LockFile

Защищает файл от доступа к нему из других

 

программ

LockFileEx

Устанавливает способ использования файла

 

другими программами

MoveFile

Переименовывает файл или каталог (с подка-

 

талогами)

MoveFileEx

Переименовывает файл

OpenFile

Открывает существующий файл

QueryDosDevice

Получает информацию об именах дисков

 

(устройств), используемых в MS-DOS

ReadFile

Читает данные из файла

ReadFileEx

Реализует асинхронное чтение данных из

 

файла

RemoveDirectory

Удаляет пустой каталог

SearchPath

Ищет файл в заданном каталоге (каталогах)

SetCurrentDirectory

Устанавливает умалчиваемый каталог

SetEndOfFile

Перемещает файловый указатель в конец

 

файла

SetFileApisToANSI

Предписывает Windows использовать кодо-

 

вую страницу ANSI при файловых операциях

SetFileApisToOEM

Предписывает Windows использовать кодо-

 

вую страницу MS-DOS при файловых опера-

 

циях

SetFileAttributes

Устанавливает атрибуты файла

SetFilePointer

Перемещает файловый указатель на нужную

 

позицию

SetHandleCount

Устанавливает количество файлов, одновре-

 

менно используемых программой

SetVolumeLabel

Устанавливает новую метку тома (носителя

 

информации)

UnlockFile

Снимает с файла защиту, установленную

 

функцией LockFile

UnlockFileEx

Снимает с файла защиту, установленную

 

функцией LockFileEx

WriteFile

Записывает данные в файл

WriteFileEx

Реализует асинхронную запись в файл

Изучение работы с файлами в системе Delphi

195

Пример программирования с использованием файлов

Задание. Составить программу для работы с каталогом книг в библиотеке.

Для определения каждой книги создается запись TRecord с полями: name – «Имя автора», title − «Название книги», code − «Код по каталогу». Создается также нетипизированный файл, состоящий из записей типа TRecord и переменная vs типа TRecord для промежуточного хранения записей. В этой программе используются две формы − Form1 и Form2. Обращение к форме Form2 происходит при нажатии кнопок «Добавить» и «Заменить». Вид форм представлен ниже (рис. 10.1, 10.2).

Рис. 10.1. Вид формы Form1

Рис. 10.2. Вид формы Form2

196

Изучение работы с файлами в системе Delphi

Текст программы:

unit Unit1; interface uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Buttons, StdCtrls;

type

TRecord=Record

 

name, title: String[80];

//имя автора, название книги

code: string[20];

//код по каталогу

end;

 

TForm1 = class(TForm)

 

SpeedButton1: TSpeedButton;

SpeedButton2: TSpeedButton;

SpeedButton3: TSpeedButton;

SpeedButton4: TSpeedButton;

SpeedButton5: TSpeedButton;

OpenDialog1: TOpenDialog;

SaveDialog1: TSaveDialog; Edit1: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel; SpeedButton6: TSpeedButton; Label5: TLabel; SpeedButton7: TSpeedButton;

procedure SpeedButton1Click(Sender: TObject); procedure SpeedButton3Click(Sender: TObject); procedure SpeedButton2Click(Sender: TObject); procedure SpeedButton4Click(Sender: TObject); procedure SpeedButton5Click(Sender: TObject); procedure SpeedButton6Click(Sender: TObject); procedure SpeedButton7Click(Sender: TObject); private

Изучение работы с файлами в системе Delphi

197

{Private declarations } public

{Public declarations } end;

var

Form1: TForm1;

F1:file of TRecord; vs:TRecord; number:integer;

implementation uses Unit2; {$R *.dfm}

//---------Нажатие на кнопку «Создать файл»------------------

procedure TForm1.SpeedButton1Click(Sender: TObject); begin

if SaveDialog1.Execute then begin

AssignFile(F1,SaveDialog1.FileName); //Связываем файловую переменную

//F1 со значением SaveDialog1.FileName Rewrite(F1);

{Инициируем запись информации в файл, связанный с файловой переменной F1}

SpeedButton3.Enabled:=True; //Показать кнопку "Добавить" Form1.SpeedButton7.Enabled:=True;

//Показать кнопку "Закрыть файл" Form1.SpeedButton1.Enabled:=False; //Скрыть кнопку "Создать файл"

Form1.SpeedButton2.Enabled:=False; //Скрыть кнопку "Открыть файл" end;

end;

//-------------Нажатие на кнопку «Добавить»------------------

procedure TForm1.SpeedButton3Click(Sender: TObject); begin

Form2.Edit1.Text:=''; //Обнуляем строки для ввода значений

Form2.Edit2.Text:='';

198

Изучение работы с файлами в системе Delphi

Form2.Edit3.Text:='';

Form2.ShowModal;

if IsYes then //если нажата кнопка «Да» на Form2 begin

vs.name:=Form2.Edit1.text; //Присваиваем полям записи vs.title:=Form2.Edit2.text; //введенные значения vs.code:=Form2.Edit3.text;

Seek(F1,Filesize(f1)); //Переходим в конец файла

Write(F1,vs); //Добавляем новую запись в файл end;

Form1.Label5.caption:=IntToStr(Filesize(f1)); //Выводим количество записей

end;

//-------------Нажатие на кнопку «Открыть файл»------------

procedure TForm1.SpeedButton2Click(Sender: TObject); begin

if OpenDialog1.Execute then begin

Form1.Label1.Enabled:=True; //Показать надписи с 1 по 5 Form1.Label2.Enabled:=True; Form1.Label3.Enabled:=True; Form1.Label4.Enabled:=True; Form1.Label5.Enabled:=True;

Form1.Edit1.Enabled:=True; //Показать окошки для редактиро-

вания

Form1.Edit2.enabled:=True; //полей записи Form1.Edit3.enabled:=True; Form1.SpeedButton4.Enabled:=True;//Показать кнопку

«Вперед»

Form1.SpeedButton5.Enabled:=True;//Показать кнопку «Назад» Form1.SpeedButton3.Enabled:=True;//Показать кнопку «Доба-

вить»

Form1.SpeedButton6.Enabled:=True;//Показать кнопку «Заме-

нить» //Показать кнопку «Закрыть файл»

Form1.SpeedButton7.Enabled:=True;

Изучение работы с файлами в системе Delphi

199

Form1.SpeedButton1.Enabled:=False; {Показать кнопку «Соз-

дать файл»} Form1.SpeedButton2.Enabled:=False; //Показать кнопку «Открыть файл»

AssignFile(F1,OpenDialog1.FileName);{Связываем файловую переменную F1 со значением OpenDialog1.FileName}

Reset(F1); //Инициируем файл для чтения Read(f1,vs); //Считываем запись из файла //Выводим на экран значения полей записи

Form1.Edit1.Text:=vs.name;

Form1.Edit2.Text:=vs.title;

Form1.Edit3.Text:=vs.code; //Выводим количество записей

Form1.Label5.caption:=IntToStr(Filesize(F1));

end;

end;

 

//---------------

Нажатие на кнопку «Вперед»-----------------

procedure TForm1.SpeedButton4Click(Sender: TObject); begin

If Number+1<FileSize(f1) then

//если номер следующего элемента меньше, чем номер последнего begin

Number:=Number+1;

Seek(F1,Number); //Переводим указатель на следующую за-

пись

Read(f1,vs); //Считываем запись из файла Edit1.Text:=vs.name; //Выводим на экран значения полей за-

писи

Edit2.Text:=vs.title;

Edit3.Text:=vs.code;

end;

end;

 

//---------------

Нажатие на кнопку «Назад»-----------------

procedure TForm1.SpeedButton5Click(Sender: TObject); begin

If Number>0 then //если номер текущего элемента больше нуля begin

200

Изучение работы с файлами в системе Delphi

Number:=Number-1;

//Переводим указатель на предыдущую запись

Seek(F1,Number); Read(f1,vs); //Считываем запись из файла

Edit1.Text:=vs.name; //Выводим на экран значения полей за-

писи

Edit2.Text:=vs.title;

Edit3.Text:=vs.code;

end;

end;

//----------------Нажатие на кнопку «Заменить»-----------------

procedure TForm1.SpeedButton6Click(Sender: TObject); begin

Form2.Edit1.Text:=''; //Обнуляем строки для ввода значений

Form2.Edit2.Text:='';

Form2.Edit3.Text:='';

Form2.ShowModal;

if IsYes then //если нажата кнопка «Да» на Form2 begin

vs.name:=Form2.Edit1.text; //Присваиваем полям записи vs.title:=Form2.Edit2.text; //введенные значения vs.code:=Form2.Edit3.text;

//Переводим указатель на предыдущую позицию

Seek(f1,FilePos(f1)-1);

Write(F1,vs); //Добавляем новую запись в файл end;

//Переводим указатель на предыдущую позицию

Seek(f1,FilePos(f1)-1);

Read(f1,vs); //Считываем запись из файла //Выводим на экран считанные значения записи

Form1.Edit1.Text:=vs.name;

Form1.Edit2.Text:=vs.title;

Form1.Edit3.Text:=vs.code;

end;

//------------Нажатие на кнопку «Закрыть файл»---------------

procedure TForm1.SpeedButton7Click(Sender: TObject); begin

CloseFile(f1); //Закрываем файл, связанный с переменной F1 Form1.Label1.Enabled:=False; //Скрыть надписи с 1 по 5