logo search
Программирование в среде Delphy / Программирование в среде Delphi

14.3. Нетипированные файлы

Файлы без типа, нетипированные файлы, определяются, например оператором:

Var F:file;

Эти файлы являются файлами с прямым доступом и фиксированной длиной одного блока. Длина одного блока по умолчанию равняется 128 байтам. Приведем дополнительные процедуры и функции для работы именно с такими файлами:

Procedure ReWrite(var f:file[;ReсSize:word]); – открытие нового файла на запись, RecSize – длина одного блока в байтах;

Procedure Reset(var f:file[;RecSize:Word]); – открытие файла на чтение, RecSize – длина одного блока в байтах;

Procedure BlockRead(var f:file; var Buf; Count:Integer[;var Result:Integer]); – чтение блоков из файла f и запись их в буфер – Buf. Count – число блоков, которые хотим прочитать, Result – число блоков, реально прочитанных;

Procedure BlockWrite(var f:file; var Buf; Count:Integer [; var Result:Integer ]); – запись блоков в файл f из буфера Buf. Count – число блоков, которые хотим записать, Result – число блоков, реально записанных в файл;

Function FileSize(var f:file):Integer; – возвращает число записанных блоков в файле f.

В качестве примера работы с нетипированными файлами приведем текст программы быстрого копирования файлов, которая может быть вызвана прямо из командной строки операционной системы:

Program CopyMy;

Const LBuf=65000; // Длина буфера

Var f1,f2:File; // f1 – файл чтения, f2 – файл записи

s1,s2:String; // Строки для хранения путей к файлам

Buf:Array[1..Lbuf] of byte; // Буфер

io,lr,lrt,lw,lwt:integer; // Внутренние переменные

Begin

// Проверка наличия двух параметров в командной строке

If paramcount<2 then Begin

ShowMessage(’Обращение к программе: CopyMy f1 f2’);

Halt; // Аварийный выход из программы

End;

S1:=paramstr(1); // Из командной строки извлекаем путь к файлу чтения

S2:=paramstr(2); // Из командной строки извлекаем путь к файлу записи

Assignfile(f1,s1);

{$I-}

Reset(f1,1); // Открываем файл f1 на чтение с длиной блока в 1 байт

Io:=IOResult;// Запоминаем ошибку открытия файла f1

{$I+}

if io<>0 then Begin

ShowMessage(’Файла ’+s1+’ нет!’);

Halt;

End;

Assignfile(f2,s2);

ReWrite(f2,1); // Открываем файл f2 на запись с длиной блока в 1 байт

While not Eof(f1) do Begin // Открываем цикл переписи файла f1

lr:=lbuf;

BlockRead(f1,Buf,lr,lrt); // Читаем из f1 lr блоков

BlockWrite(f2,Buf,lrt,lwt); // Записываем в f2 lrt блоков

If lrt<>lwt then Begin // Проверяем правильность записи

ShowMessege(’Ошибка при переписи файла’);

Halt;

End;

End;

CloseFile(f1); // Закрываем файлы

CloseFile(f2);

End.

Обращение к такой программе из командной строки, например, может быть таким:

CopyMy A:\p1.pas C:\my\p1.pas