Работа с нетипизированными файлами

Нетипизированные файлы — это файлы без определенной структуры. В общем случае, нетипизированные файлы — это типизированные файлы, в которых вместо записей используются байты. Объявление переменной нетипизированного файла выглядит следующим образом:

var

F: file;

При работе с нетипизированными файлами обращения к процедурам Reset и Rewrite выглядят несколько иначе. Обычно обе эти процедуры в качестве заданного по умолчанию размера записи используют 128 байт. При работе с нетипизированными файлами этот размер должен быть установлен равным 1 байту. Это можно выполнить, передавая 1 в качестве второго параметра в обоих вызовах:

Reset (F, 1);

Rewrite(F, 1);

Для считывания и записи данных в нетипизированные файлы применяются процедуры BlockRead и BlockWrite. Объявления этих процедур показаны ниже:

procedure BlockRead(var F: File; var Buf; Count: Integer [; var AmtTransferred: Integer]);

procedure BlockWrite(var F: File; var Buf; Count: Integer [; var AmtTransferred: Integer]);

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

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

Приложение, код которого представлен в ниже, использует процедуры BlockRead и BlockWrite для предоставления пользователю возможности копирования файлов. Приложение также дает пользователю возможность указывать имена исходного и целевого файлов в командной строке.

program Project1;

{$APPTYPE CONSOLE}

uses

SysUtils;

procedure BlockCopyFile(const SrcPath, DestPath: string);

var

Src: &file;

Dest: &file;

Buffer: array[1..1024] of Byte;

BytesRead: Integer;

begin

if LowerCase(SrcPath) = LowerCase(DestPath) then Exit;

AssignFile(Src, SrcPath);

{$I-}

Reset(Src, 1);

{$I+}

if IOResult = 0 then

begin

AssignFile(Dest, DestPath);

{$I-}

Rewrite(Dest, 1);

{$I+}

if IOResult = 0 then

begin

BytesRead:= -1;

while BytesRead <> 0 do

begin

BlockRead(Src, Buffer, SizeOf(Buffer), BytesRead);

BlockWrite(Dest, Buffer, BytesRead);

end;

CloseFile(Dest);

Write('File successfully copied.');

end;

CloseFile(Src);

end; // если Reset выполнена успешно

end;

var

SourcePath: string;

DestPath: string;

begin

{ Прием параметров }

if ParamCount = 2 then

BlockCopyFile(ParamStr(1), ParamStr(2))

else begin

{ если командная строка не содержит параметров,

пользователю предлагается ввести в ней имена файлов }

Write('Source path: ');

Readln(SourcePath);

Write('Destination path: ');

Readln(DestPath);

if (SourcePath <> '') and (DestPath <> '') then

BlockCopyFile(SourcePath, DestPath);

end;

Writeln('Press Enter to exit.');

Readln;

end.

Для выяснения количества параметров, которые пользователь передал приложению, применяется функция ParamCount. Эта функция не принимает никаких параметров и возвращает значение 0. если пользователь вызвал приложение без дополнительных параметров.

Для считывания параметров, переданных приложению, служит функция ParamStr, которая принимает единственный параметр типа Integer — индекс параметра. Если передать этой функции значение 0, она возвратит путь и имя файла приложения. Индексы пользовательских параметров, если они переданы, начинаются с 1.

Вначале приложение проверяет, передал ли пользователь два параметра в командной строке. Если да, то ParamStr(1) содержит путь к исходному файлу, а ParamStr(2) —путь к файлу назначения.

Копирование выполняется в процедуре BlockCopyFile.

Ее первая строка:

if Lowercase(SrcPath) = LowerCase(DestPath) then Exit;

использует функцию LowerCase для временного преобразования имен обоих файлов в строчные буквы и проверяет, указывают ли оба имени файлов на один и тот же файл. Если файл назначения и файл-источник совпадают, никакое копирование не требуется и оператор if-then вызывает процедуру Exit для выхода из процедуры.

Основная часть процедуры BlockCopyFile — цикл while, который вызывает процедуры BlockRead и BlockWrite:

while BytesRead <> 0 do

begin

BlockRead(Src, Buffer, SizeOf(Buffer), BytesRead);

BlockWrite(Dest, Buffer, BytesRead);

end;

Процедура BlockRead считывает из файла 1 Кбайт данных, записывает эти данные в массив Buffer и обновляет переменную BytesRead, которая всегда содержит точное количество переданных байтов. Выполнение цикла будет повторяться до тех пор, пока процедура BlockRead продолжает считывать данные из файла. Когда эта процедура достигнет конца файла, значение переменной BytesRead будет сброшено в 0, условие цикла while станет ложным и копирование файла завершится.



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



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