Нетипизированные (двоичные) файлы

 

Нетипизированные файлы позволяют открывать произвольные файлы в двоичном режиме и осуществлять побайтовый доступ. Данный тип файлов не имеет никакого преимущества перед другими методами работы с файлами.

Такие файлы похожи на типизированные, но отличаются тем, что тип не указывается. Данные читаются целыми частями — по несколько сот или тысяч байт. Это, пожалуй, самый быстрый доступ к файлам. Но разбираться в этих данных, если неизвестна структура данных, придется вручную. Такого автоматического разбора по переменным, как в типизированном файле, здесь нет.

Для нетипизированных файлов нам доступны Rewrite и Reset - равно как и для типизированных файлов. Но тут есть одно важное отличие: для нетипизированных файлов эти процедуры принимают два параметра. Первый параметр, как обычно, файловая переменная, а второй параметр - размер блока. Размер блока измеряется в байтах и является аналогом размера записи у типизированных файлов.

Второй параметр, размер блока, является опциональным, его можно не указывать. Если не указывать размер блока, то размер блока по умолчанию будет 128 байт.

Для чтения и записи в нетипизированный файл вместо Read и Write используются функции BlockRead и BlockWrite. Обе они используются одинаково: первый параметр - файловая переменная, второй параметр - что пишем/читаем, третий параметр - сколько пишем/читаем (в блоках).

Следует заметить, что достаточно часто вместо использования типизированного файла оказывается проще открыть файл в двоичном режиме (как нетипизированный) и загрузить/сохранить все данные.

 

Примеры работы с файлом.

 

Пример 1: чтение/запись файла с использованием цикла.

Type

TData = real; // запись или что угодно - элемент нашей БД.

end;

Var

Data: array of TData;

F: file of TData;

Index: Integer;

Begin

// <- заполнение переменной Data

………………………………………………………………………………

// Запись:

AssignFile(F, 'Test.bin');

Rewrite(F);

for Index:= 0 to High(Data) do Write(F, Data[Index]);

// High - системная функция, возвращает номер последнего элемента массива

// Low - первого элемента

CloseFile(F);

 

// Чтение:

AssignFile(F, 'Test.bin');

Reset(F);

SetLength(Data, FileSize(F));

for Index:= 0 to High(Data) do Read(F, Data[Index]);

CloseFile(F);

end;

 

Пример 2: чтение/запись файла с использованием BlockRead и BlockWrite.

var

Data: array of real;

F: file;

begin

// <- заполнение Data

........................

// Запись:

AssignFile(F, 'Test.bin');

Rewrite(F, SizeOf(Data));

BlockWrite(F, Pointer(Data)^, Length(Data));

CloseFile(F);

 

// Чтение:

AssignFile(F, 'Test.bin');

Reset(F, SizeOf(TData));

SetLength(Data, FileSize(F));

BlockRead(F, Pointer(Data)^, Length(Data));

CloseFile(F);

end;

 

Здесь Pointer(Data)^ - указатель на массив (адрес памяти начала массива).


 

ДОПОЛНИТЕЛЬНЫЕ   ФУНКЦИИ РАБОТЫ С ФАЙЛАМИ

 

К функциям для работы с файлами, рассмотренными выше, добавились функции, рабо­тающие с дескриптором файла. Они рассматривают файл как двоичный.

 Файловые функции, описанные в модуле SYSUTILS, приведены в таблице:

FileOpen(const FileName: string; Mode: Word): Integer; Открывает существующий FileName файл в режиме Mode (см. примеч. 1). Значение, возвра­щаемое в случае успеха, — дескриптор открытого файла(цедое положительное число). В противном случае — код ошибки DOS.
FileCreate(const FileName: string): Integer; Создает файл с именем FileName. Возвращает то же, что и FileOpen.
FileRead(Handle: Integer; var Buffer; Count: Longint): Longint; Считывает из файла с дескриптором Handle Count байт в буфер Buffer. Возвращает число реально прочитанных байт или (-1) при ошибке.
FileWrite(Handle: Integer; const Buffer; Count: Longint): Longint; Записывает в файл с дескриптором Handle Count байт из буфера Buffer. Возвращает число реально записанных байт или -1 при ошибке.
FileSeek(Handle: Integer; Offset: Longint; Origin: Integer): Longint; Позиционирует файл с дескриптором Handle в новое положение. При Origin = 1,2,3 положение смещается на Offset байт от начала файла, текущей позиции и конца файла соответственно. Возвращает новое положение или -1 при ошибке.
FileClose(Handle: Integer); Закрывает файл с дескриптором Handle.
FileAge(const FileName: string): Longint Возвращает значения даты и времени создания файла или -1, если файл не существует.
FileExists(const FileName: string): Boolean; Возвращает True если файл FileName существует и найден.
FindFirst(const Path: string; Attr: Integer; var SearchRec: TSearchRec): Integer; Ищет первый файл, удовлетворяющий маске поиска, заданной в Path и с атрибутами Attr (см. примеч. 2). В случае успеха заполняет запись SearchRec (см. примеч. 3) и возвращает 0, иначе возвращает код ошибки DOS

 

 

FindNext(var SearchRec: TSearchRec): Integer; Продолжает процесс поиска файлов, удовлетворяющих маске поиска. Параметр SearchRec должен быть заполнен при помощи FindFirst. Возвращает 0, если очередной файл найден, или код ошибки DOS. Изменяет SearchRec.
FindClose (var SearchRec: TSearchRec); Завершает процесс поиска файлов, удовлетворяющих маске поиска.
FileGetDate(Handle: Integer): Longint; Возвращает время создания файла с дескриптором Handle (в формате DOS) или -1, если дескриптор недействителен.
FileSetDate(Handle: Integer; Age: Longint); Устанавливает время создания файла с дескриптором Handle (в формате DOS).
FileGetAttr(const FileName: string): Integer; Возвращает атрибуты (см. примеч. 2) файла с именем FileName или код ошибки DOS, если файл не найден.
FileSetAttr(const FileName: string; Attr: Integer): Integer; Устанавливает атрибуты файла с именем FileName.
DeleteFile(const FileName: string): Boolean; Уничтожает файл с именем FileName и в случае успеха возвращает True
RenameFile(const OldName, NewName: string): Boolean; Переименовывает файл с именем OldName в NewName и возвращает True в случае успеха.
ChangeFileExt(const FileName, Extension: string): string; Изменяет расширение в имени файла FileName на Extension и возвращает новое значение FileName. Имя файла не изменяется.
ExtractF i LePath(const FileName: string): string; Извлекает из строки с полным именем файла FileName часть, содержащую путь к нему.
ExtractFileName(const FileName: string): string; Извлекает из строки с полным именем файла FileName часть, содержащую его имя и расширение.
ExtractFileExt(const FileName: string): string; Извлекает из строки с полным именем файла FileName часть, содержащую его расширение.
ExpandFileName(const FileName: string): Возвращает полное имя файла FileName, добавляя при необходимости путь к нему
FileSearch(const Name, DirList: string): string; Производит поиск файла с именем Name в группе каталогов, заданных параметром DirList. Имена каталогов должны отделяться друг от друга точкой с запятой. Возвращает в случае успеха полное имя файла или пустую строку, если файл не найден.

 

DiskFrее(Drive: Byte): Longint; Возвращает количество в байтах свободного места на заданном диске. Значение параметра Drive: 0 — для текущего диска, I — для А, 2 — для В и т. д. Если параметр неверен, функция возвращает -I.
DiskSize(Drive: Byte): Longint; Возвращает размер диска Drive в байтах. Параметр Drive означает то же, что и в DiskFree.
FileDateToDateTime(FileDate: Longint): TDateTime; Преобразует дату и время в формате DOS в принятый в Delphi формат TDateTime.
DateTimeToFileDate(DateTime: TDateTime): Longint; Преобразует дату и время из формата TDateTime в формат DOS.

 

   
       

Примечания:

1. Допустимы следующие режимы открытия файлов:

Режим

Значение

Что означает

fmOpenRead

$0000

Открыть только для чтения.

fmOpenWrite

$0001

Открыть только для записи.

fmOpenReadWrite

$0002

Открыть для чтения и записи.

fmShareCompat

$0000

Обеспечить совместимость со старой моделью доступа к файлам.

fmShareExclusive

$0010

Запретить другим доступ к файлу.

 

fmShareDenyWrite

$0020

Запретить другим запись в файл.

 

fmShareDenyRead

$0030

Запретить другим чтение файла.

 

fmShareDenyNone

$0040

Разрешить другим все виды доступа.

 

     
               

 

2. Файлы могут иметь следующие атрибуты:

 

faReadOnly $01
faHidden $02
faSysFile $04
faVolumelD $08
faDirectory $10
faArchive $20
faAnyFile $3F

 

 

3. Формат структуры TSearchRec:

 

TSearchRec = record

Fill: array[1..21] of Byte;

Attr: Byte;

Time: Longint;

Size: Longint;

Name: string [12];

end;

 

Приведем типовой вариант организации групповой обработки файлов при помощи функций FindFirst, FindNext и FindClose. В нем в список добав­ляются имя и длина всех файлов в каталоге с именем C:\DELPHI:

 


Var

SearchRec: TSearchRec;

I: Integer;

List: TStringList;

Begin

List:= TStringList.Create;

I:= FindFirst('c:\delphi\*.*', faAnyFile, SearchRec);

while I = 0 do begin

List.Add(Format (' File %s has length %d bytes ',

SearchRec.Name, SearchRec.Size]));

I:= FindNext(SearchRec);

end;

FindClose(SearchRec);

List.Free;

end;

 

При поиске файла наиболее вероятным является код ошибки -18 (файл не найден).


 



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: