Системное программирование в UNIX средствами Free Pascal


         

Пример copyfile


Теперь можем закрепить материал на практике. Задача состоит в написании функции copyfile, которая будет копировать содержимое одного файла в другой. Возвращаемое значение должно быть равно нулю в случае успеха или отрицательному числу – в случае ошибки.

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

Окончательное решение может выглядеть таким образом:

(* Программа copyfile: скопировать файл name1 в файл name2 *)

uses linux;

const

  BUFSIZE=512;         (* Размер считываемого блока *)

  PERM=0644;           (* Права доступа для нового файла в форме,

                         похожей на восьмеричную *)

(* Скопировать файл name1 в файл name2 *)

function copyfile(name1, name2: string):integer;

var

  infile, outfile: integer; (*дескрипторы файлов*)

  nread: longint;

  buffer: array [0..BUFSIZE-1] of byte; (*буфер для чтения/записи*)

begin

  infile := fdopen (name1, Open_RDONLY);

  if infile=-1 then

  begin

    copyfile:=-1; (*ошибка открытия первого файла*)

    exit;

  end;

  outfile := fdopen (name2, Open_WRONLY or Open_CREAT or Open_TRUNC, octal(PERM));

  if outfile=-1 then

  begin

    fdclose(infile);

    copyfile:=-2; (*ошибка открытия второго файла*)

    exit;

  end;

  (* Чтение из файла name1 по BUFSIZE символов *)

  nread := fdread (infile, buffer, BUFSIZE);

  while nread > 0 do

  begin

    (* Записать buffer в выходной файл. *)

    if fdwrite (outfile, buffer, nread) < nread then

    begin

      fdclose (infile);

      fdclose (outfile);

      copyfile:=-3;          (* ошибка записи *)

      exit;

    end;

    nread := fdread (infile, buffer, BUFSIZE);

  end;

  (*закрываем прочитанные файлы*)

  fdclose (infile);

  fdclose (outfile);

  if (nread = -1) then

    copyfile := -4           (* ошибка при последнем чтении *)




Содержание  Назад  Вперед