Написание программы производящей копирование файлов

Страницы работы

Содержание работы

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

Кафедра экономической информатики

Расчетно-графическая работа по курсу

«Операционные системы»

Вариант №4

Факультет Бизнеса

Группа: ФБИ-

Выполнил

Проверил Сваровский С.Г.

Новосибирск

2007

По варианту задания требуется написать программу, которая выполняется наподобие команды COPY из MsDOS, в оригинале программа производит копирование файлов.

На рисунке 1 представлена блок-схема работы программы:

Рисунок 1. Блок-схема работы программы.

Текст программы:

program copy2;      //название программы в процессах

{$APPTYPE CONSOLE}  //директива компилятору что это

                    //консольное приложение и ей требуется окно

uses

  SysUtils,classes,CRC;      //Подключаемые библиотеки, CRC не

                             //стандартная, взята из Интернета

var str:string;         //str - буферная переменная используется при вопросе о перезаписи

    Y,V:boolean;        //флаги о встрече ключей /Y и /N

    CRC1,CRC2:longint;  //переменные, где промежуточно хранятся расчётные CRC

function RCopyFile(InFile,OutFile: String): boolean; //функция копирования

var

  InFS,OutFS: TFileStream;    //файловые потоки

begin

  InFS  := TFileStream.Create( InFile,  fmOpenRead );     //инициализация потоков

  OutFS := TFileStream.Create( OutFile, fmCreate   );

  InFS.Seek( 0, soFromBeginning );                        //маркер начала

  if OutFS.CopyFrom( InFS, 0 )=0 then Result:=true else Result:=false;     //копирование

  InFS.Free;                                              //закрытие потоков

  OutFS.Free;

end;

begin

 if paramstr(1)='/?' then    //если встретился ключ /? Тогда

 begin                       //выводим справку

  Writeln('Программа копирует указанный файл в указанный');

  Writeln('Синтаксис: copy2 файл1 файл 2 [/Y] [/V]');

  Writeln('ключ /Y подавляет запросы о замене');

  Writeln('при ключе /V проводится проверка правильности копирования');

end else

   if paramcount<2 then    //если ключей меньше двух

   begin                   //выводим ошибку

    Write('ошибка в синтаксисе');

   end else

   begin

    if (Paramstr(3)='/Y')or(Paramstr(4)='/Y') then y:=true else y:=false;  //проверяем наличие ключей на позициях

    if (Paramstr(3)='/V')or(Paramstr(4)='/V') then v:=true else v:=false;  // 3 и 4 если есть помечаем в соответствующем флаге

    if not fileexists(ParamStr(1)) then  //если первый файл недоступен

    begin

     WriteLn('Файл '+ParamStr(1)+' не найден или недоступен');   //выводим ошибку

     exit;                                                       //и завершаем выполнение

    end;

    if fileexists(ParamStr(2))and(not Y) then                 //проверка на существование второго файла

    begin                                                     //если он есть и помечен ключ Y то

     WriteLn('заменить текущий файл '+ParamStr(2)+' ?[Y/N]'); //выводим вопрос о замене

     repeat                                                   //и в цикле

      Readln(str);                                            //введённое пользователем

      if str='N' then halt;                                   //если N завершаем программу

     until str='Y';                                           //цикл пока ключ не будет равен Y

    end;

    if not Rcopyfile(PChar(ParamStr(1)),PChar(ParamStr(2))) then  //пробуем произвести копирование

     begin

      WriteLn('Произошла ошибка при копировании');    //если не получилось выводим ошибку

     end;

    if V then                                         //если флаг N помечен

      begin

       Write('Рассчёт CRC для файла '+ParamStr(1)+'... ');       //выводим сообщение о действиях

       if FileCRC32(ParamStr(1),CRC1) then WriteLn('OK') else    //пробуем считать CRC если получилось пишем OK

        begin

         WriteLn('Ошибка при проверке, нет доступа к файлу '+ParamStr(1)); //иначе пишем ошибку

         exit;                                                             //и завершаем выполнение

        end;

       Write('Рассчёт CRC для файла '+ParamStr(2)+'... ');       //выводим сообщение о действиях

       if FileCRC32(ParamStr(2),CRC2) then WriteLn('OK') else    //пробуем считать CRC если получилось пишем OK

        begin

         WriteLn('Ошибка при проверке, нет доступа к файлу '+ParamStr(2)); //иначе пишем ошибку

         exit;                                                             //и завершаем выполнение

        end;

       if CRC1=CRC2 then WriteLn('CRC равны, копирование прошло успешно')  //если CRC равны сообщаем что всё прошло успешно

          else WriteLn('CRC не равны, копирование прошло неудачно')        //иначе выводим сообщение об ошибке

      end;

   end;

end.

Примеры работы программы:

1)  Неверный ввод параметров

C:\Documents and Settings\User\Мои документы\Borland Studio Projects\copy2>copy2

ошибка в синтаксисе'

2)  Вывод помощи

C:\Documents and Settings\User\Мои документы\Borland Studio Projects\copy2>copy2 /?

Программа копирут указанный файл в указанный

Синтаксис: copy2 файл1 файл 2 [/Y] [/V]

ключ /Y подавляет запросы о замене

при ключе /V проводится проверка правильности копирования

3)  Замена файла с последующей проверкой правильности копирования

C:\Documents and Settings\User\Мои документы\Borland Studio Projects\copy>copy2 qwe ewq /V

заменить текущий файл ewq ?[Y/N]Y

Рассчёт CRC для файла qwe... OK

Рассчёт CRC для файла ewq... OK

CRC равны, копирование прошло успешно

Похожие материалы

Информация о работе