Belova_TM
.pdfИзучение работы с файлами в системе 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