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