Нетипизированные файлы позволяют открывать произвольные файлы в двоичном режиме и осуществлять побайтовый доступ. Данный тип файлов не имеет никакого преимущества перед другими методами работы с файлами.
Такие файлы похожи на типизированные, но отличаются тем, что тип не указывается. Данные читаются целыми частями — по несколько сот или тысяч байт. Это, пожалуй, самый быстрый доступ к файлам. Но разбираться в этих данных, если неизвестна структура данных, придется вручную. Такого автоматического разбора по переменным, как в типизированном файле, здесь нет.
Для нетипизированных файлов нам доступны 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 (файл не найден).






