![]() |
|
|
Курсовая работа: Эмуляция командного процессора ОС UNIX в среде Windows 9x2. Информатика: Учеб. пособие для студ. вузов / А.В. Могилев, Н.И. Пак, Е.К. Хеннер; под ред. Е.К. Хеннера. – М.: Изд. центр «Академия», 2000. – 816 с. 3. UNIX: Справочник / Рейчард К., Фостер - Джонсон Э. – Спб: Питер Ком, 1999. - 384 с. Приложение А Листинг программы Program unix_com; Uses Dos; Var comu:string; s_or_f:text; k:integer; Function Unix_num (comu:string):integer; const inp:array[1..9] of string[6] = ( 'ls', 'dircmp', 'tr', 'comm', 'rmdir', 'cat', 'mv', 'man', 'exit'); var f:boolean; i:integer; Begin f:=False; for i:=1 to 9 do if (Copy(comu, 1, Pos(' ', comu)-1)=inp[i]) or (comu=inp[i]) then begin f:=True; Break; end; if not f then i:=11; Unix_num:=i; End; Procedure Reout(var comu:string); var Dev:string; Flag:boolean; Begin Dev:='con'; Flag:=False; if Pos ('>', comu) <> 0 then begin if Pos ('>>', comu) <> 0 then begin Delete (comu, Pos('>', comu), 1); Flag:=True; end; Dev:=Copy(comu, Pos('>', comu)+1, Length(comu)-Pos('>', comu)+1); if Dev[1]='' then Delete(dev, 1, 1); Delete(comu, Pos('>', comu), Length(comu)-Pos('>', comu)+1); end; Assign (s_or_f, dev); if Flag then begin {$I-} Append (s_or_f); {$I+} if IOResult <> 0 then Rewrite (s_or_f); end else Rewrite(s_or_f); End; Function Error (comu:string):boolean; Begin Error:=False; if Pos(' ', comu)=0 then begin WriteLn('Команда введена неверно!'); Error:=True; end; end; Procedure Spaces (var s:string); Begin while Pos(' ', s)<>0 do Delete(s, Pos(' ', s), 1); while Pos(' ', s)=1 do Delete(s, 1, 1); if s[Length(s)]=' ' then Delete (s, Length(s), 1); end; Procedure Attr(at:byte); const Ast:array[0..6] of string[5] = ( '-', 'R', 'H', 'S', 'V', '<DIR>', 'A'); A16:array[0..6] of byte = ( $00, $01, $02, $04, $08, $10, $20); var i, i1, i2, i3, i4, i5:integer; at1:byte; ss:string[20]; Begin for i:=0 to 1 do for i:=1 to 2 do for i:=2 to 3 do for i:=3 to 4 do for i:=4 to 5 do for i:=5 to 6 do begin at1:=A16[i]+A16[i1]+A16[i2]+A16[i3]+A16[i4]+A16[i5]; if at1=at then begin ss:=Ast[i]+Ast[i1]+Ast[i2]+Ast[i3]+Ast[i4]+Ast[i5]+''; write(s_or_f, ss); Exit; end; end; End; Procedure Ls(comu: string); var Info: SearchRec; dt: DateTime; atr: byte; keys, maska, cmd1: string; o1, p1, a1, p, l, r: boolean; nn, pos1: integer; c0: string[1]; begin atr := $3F; Spaces(comu); cmd1 := comu; Delete(comu, 1, 3); keys := ''; if Pos('-', comu) <> 0 then begin if Pos(' ', comu) = 0 then pos1 := Length(comu) else pos1 := Pos(' ', comu); keys := Copy(comu, 1, pos1); Delete(comu, 1, pos1); end; if Pos('l', keys) <> 0 then l := True else l := False; if Pos('1', keys) <> 0 then o1 := True else o1 := False; if Pos('a', keys) <> 0 then a1 := True else a1 := False; if Pos('p', keys) <> 0 then p1 := True else p1 := False; if Pos('R', keys) <> 0 then r := True else r := False; if comu <> '' then begin if comu[Length(comu)] <> '\' then maska := comu + '\*.*' else maska := comu + '*.*' end else maska := '*.*'; FindFirst(maska, atr, Info); if Info.Name = '.' then FindNext(Info); nn := 0; repeat if (DosError = 0) and a1 and (Info.Name ='..') then begin Write(s_or_f, Info.Name, ' ':(15 - Length(Info.Name))); Inc(nn); end; if (DosError = 0) and (Info.Name <> '..') then begin if (Info.Attr = $10) and p1 then Info.Name := Info.Name + '\'; if (Info.Attr = $02) or (Info.Attr = $10) then begin if a1 then begin Write(s_or_f, Info.Name, ' ':(15 - Length(Info.Name))); Inc(nn); end; end else begin Write(s_or_f, Info.Name, ' ':(15 - Length(Info.Name))); Inc(nn); end; if l then begin Attr(Info.Attr); UnpackTime(Info.Time, DT); with DT do begin c0 := ''; if Day < 10 then c0 := '0'; Write(s_or_f, c0, Day, '-'); c0 := ''; if Month < 10 then c0 := '0'; Write(s_or_f, c0, Month, '-', Year); c0 := ''; if Hour < 10 then c0 := '0'; Write(s_or_f, ' ', c0, Hour, ':'); c0 := ''; if Min < 10 then c0 := '0'; if o1 then begin WriteLn(s_or_f, c0, Min, ' '); Inc(k); end else begin if nn = 3 then begin WriteLn(s_or_f, c0, Min, ' '); nn := 0; Inc(k); end else Write(s_or_f, c0, Min, ' ') end; end; end else begin if o1 then begin WriteLn(s_or_f); Inc(k); end else if nn = 3 then begin WriteLn(s_or_f); Inc(k); nn := 0; end; end; if (Info.Attr = $10) and r then begin WriteLn(s_or_f); WriteLn(s_or_f, 'Просмотр каталога ', Info.Name); Inc(k); keys := ''; if p then keys := ' |more'; if cmd1[Length(cmd1)] <> '\' then begin comu := cmd1; Delete(comu, 1, 3); if Pos('-', comu) <> 0 then begin if Pos(' ', comu) = 0 then pos1 := Length(comu) else pos1 := Pos(' ', comu); Delete(comu, 1, pos1); end; if comu = '' then Ls(cmd1 + ' ' + Info.Name + keys) else Ls(cmd1 + '\' + Info.Name + keys); end else Ls(cmd1 + Info.Name + keys); end; end; FindNext(Info); until DosError <> 0; WriteLn(s_or_f); Inc(k); end; Procedure Diff(comu: string); var fname1, fname2, f: string[80]; f1, f2: text; s1, s2: string; r, c: integer; Function Compare(s1, s2: string): integer; var i, k: integer; Begin k := 0; for i := 1 to Length(s2) do begin if i > Length(s1) then Break; if s2[i] = s1[i] then k := k + 1; end; Compare := Round(100 * k / (Length(s2) + Abs(Length(s1) - Length(s2)))); End; Begin Delete(comu, 1, 5); fname1 := Copy(comu, 1, Pos(' ', comu) - 1); Delete(comu, 1, Pos(' ', comu)); fname2 := comu; Assign (f1, fname1); Reset (f1); Assign (f2, fname2); Reset (f2); r := 0; while True do begin s1 := #0; s2 := #0; if not EOF(f1) then ReadLn(f1, s1); if not EOF(f2) then ReadLn(f2, s2); r := r + 1; if s1 <> s2 then begin Write(r, ' '); c := Compare(s1, s2); if c > 80 then WriteLn('c') else WriteLn('d'); WriteLn('<', s1); if c > 80 then WriteLn('----') else WriteLn(r, ' a'); WriteLn('>', s2); end; if EOF(f1) and not EOF(f2) then begin WriteLn('Второй файл длинее первого!'); Break; end; if EOF(f2) and not EOF(f1) then begin WriteLn('Первый файл длинее второго!'); Break; end; if EOF(f1) and EOF(f2) then Break; end; Close(f1); Close(f2); End; Procedure Dircmp(cnp: string); type FileList = array [1..500] of string[12]; var f1, f2: FileList; Flag, w, p, d, s: boolean; i, j, n1, n2, k, n, pos1, cod: integer; dir1, dir2, keys: DirStr; st: string; Procedure Scan(dir: DirStr; var f: FileList; var n: integer); var Info: SearchRec; begin if dir[Length(dir)] = '\' then dir := dir + '*.*' else dir := dir + '\*.*'; FindFirst(dir, $3F, Info); if DosError <> 0 then begin WriteLn('Ошибка при задании каталога ', dir); n := - 1; Exit; end; n := 0; if Info.Name = '.' then FindNext(Info); repeat if (DosError = 0) and (Info.Name <> '..') then begin if Info.Attr <> $10 then begin Inc(n); f[n] := Info.Name; end; end; FindNext(Info); until DosError <> 0; end; begin if Pos(' ', cnp) = 0 then begin WriteLn('Необходимо задать параметры!'); Exit; end; Delete(cnp, 1, 7); n := 72; keys := ''; if Pos('-', cnp) <> 0 then begin if Pos(' ', cnp) = 0 then pos1 := Length(cnp) else pos1 := Pos(' ', cnp); keys := Copy(cnp, 1, pos1); Delete(keys, 1, 1); Delete(cnp, 1, pos1); end; if Pos('d', keys) <> 0 then begin d := True; Delete(keys, Pos('d', keys), 1); end else d := False; if Pos('s', keys) <> 0 then begin s := True; Delete(keys, Pos('s', keys), 1); end else s := False; if Pos('w', keys) <> 0 then begin w := True; Delete(keys, Pos('w', keys), 1); while Pos(' ', keys) <> 0 do Delete(keys, Pos(' ', keys), 1); Val(keys, n, cod); if cod <> 0 then begin WriteLn('Ошибка при задании длины строки!'); Exit; end; end else w := False; dir1 := Copy(cnp, 1, Pos(' ', cnp) - 1); Delete(cnp, 1, Pos(' ', cnp)); dir2 := cnp; Scan(dir1, f1, n1); if n1 = - 1 then Exit; Scan(dir2, f2, n2); if n2 = - 1 then Exit; k := 0; WriteLn(s_or_f, 'Файлы из первого каталога.'); for i := 1 to n1 do begin cod := 0; for j := 1 to n2 do if f1[i] = f2[j] then cod := 1; if cod = 0 then begin Inc(k); WriteLn(s_or_f, f1[i]); end; end; WriteLn(s_or_f, 'Файлы из второго каталога.'); for j := 1 to n2 do begin cod := 0; for i := 1 to n1 do if f2[j] = f1[i] then cod := 1; if cod = 0 then begin Inc(k); WriteLn(s_or_f, f2[j]); end; end; if s then Exit; WriteLn(s_or_f, 'Файлы общие для двух каталогов.'); for j := 1 to n2 do begin cod := 0; for i := 1 to n1 do if f2[j] = f1[i] then cod := 1; if cod = 1 then begin Inc(k); WriteLn(s_or_f, f2[j]); if d then begin st := dir1; if st[Length(st)] = '\' then st := st + f2[j] else st := st + '\' + f2[j]; st := st + ' ' + dir2; if st[Length(st)] = '\' then st := st + f2[j] else st := st + '\' + f2[j]; Diff(st); end; end; end; end; Procedure Tr(comu: string); var p1, p2, s, s1: string; k: integer; begin if Error(comu) then exit; Delete(comu, 1, 3); if Pos(' ', comu) = 0 then begin WriteLn('Недостаточно параметров!'); exit; end; p1 := Copy(comu, 1, Pos(' ', comu) - 1); Delete(comu, 1, Pos(' ', comu)); p2 := comu; ReadLn(s); while Pos(p1, s) <> 0 do begin k := Pos(p1, s); Delete(s, k, length(p1)); insert(p2, s, k); end; WriteLn(s_or_f, s); end; Procedure Comm(comu:string); var fname1, fname2, f: string[80]; f1, f2: text; s1, s2: string; par: string[10]; r1, r2, i: integer; b, v1, v2, v3: boolean; begin if Pos(' ', comu) = 0 then begin WriteLn('Не указаны параметры команды!'); Exit; end; Delete(comu, 1, 5); if Pos(' ', comu) = 0 then begin WriteLn('Недостаточно параметров!'); Exit; end; par := ''; if Pos('-', comu) <> 0 then begin par := Copy(comu, 2, Pos(' ', comu) - 2); Delete(comu, 1, Pos(' ', comu)); end; fname1 := Copy(comu, 1, Pos(' ', comu) - 1); Delete(comu, 1, Pos(' ', comu)); fname2 := comu; if fname1 = fname2 then begin WriteLn('Одинаковые имена файлов!'); Exit; end; {$I-} Assign (f1, fname1); Reset (f1); if IOResult <> 0 then begin Writeln ('Файл ', fname1, ' не найден!'); Exit; end; Assign (f2, fname2); Reset (f2); {$I+} if IOResult <> 0 then begin Writeln ('Файл ', fname2, ' не найден!'); Exit; end; r1 := 0; r2 := 0; v1 := True; v2 := True; v3 := True; if par = '1' then v1 := False; if par = '2' then v2 := False; if par = '3' then v3 := False; if par = '12' then begin v1 := False; v2 := False; end; if par = '13' then begin v1 := False; v3 := False; end; if par = '23' then begin v2 := False; v3 := False; end; while True do begin Reset(f1); for i := 1 to r1 do ReadLn(f1, s1); Inc(r1); ReadLn(f1, s1); Reset(f2); b := False; while not EOF(f2) do begin ReadLn(f2, s2); if s1 = s2 then begin if v3 then WriteLn(s_or_f, ' ', s1); b := True; Break; end; end; if not b and v1 then WriteLn(s_or_f, s1); Reset(f2); for i := 1 to r2 do ReadLn(f2, s2); Inc(r2); ReadLn(f2, s2); if EOF(f1) and EOF(f2) then r1 := - 1; Reset(f1); b := False; while not EOF(f1) do begin ReadLn(f1, s1); if s1 = s2 then begin b := True; Break; end; end; if not b and v2 then WriteLn(s_or_f, ' ', s2); if (r1 = - 1) then Break; end; Close(f1); Close(f2); end; Procedure Rmcat(comu:string); var keys, f: string; p, s: boolean; n, i: integer; BEGIN if Error(comu) then exit; Delete(comu, 1, 6); keys := ''; if Pos('-', comu) <> 0 then begin keys := Copy(comu, 1, Pos(' ', comu)); Delete(comu, 1, Pos(' ', comu)); end; if Pos('p', keys) <> 0 then p := True else p := False; if Pos('s', keys) <> 0 then s := True else s := False; f := comu; {$I-} RmDir(f); {$I+} if IOResult <> 0 then begin if not s then WriteLn('Kаталог не существует или содержит файлы!'); Exit; end; WriteLn('Каталог ', f, ' удален.'); if p then begin if Pos('\', f) = 0 then begin GetDir(0, f); ChDir('..'); end else begin for i := 1 to Length(f) do if f[i] = '\' then n := i; f[0] := Chr(n - 1); end; RmDir(f); end; End; Procedure Cat(comu: string); var fname, fname2: string; b: string; f: text; p, Flag: boolean; k, f2: integer; begin if Error(comu) then Exit; Delete(comu, 1, 4); f2 := 0; if Pos(' ', comu) = 0 then fname := comu else begin f2 := 1; fname := Copy(comu, 1, Pos(' ', comu) - 1); fname2 := Copy(comu, Pos(' ', comu) + 1, Length(comu) - Pos(' ', comu)); end; if (fname = '-') or (fname = '') then fname := 'con'; repeat if f2 = 2 then f2 := 0; {$I-} Assign(f, fname); Reset(f); {$I+} if IOResult <> 0 then begin WriteLn('Неверное имя файла!'); Exit; end; k := 0; while not EOF(f) do begin ReadLn(f, b); k := k + 1; WriteLn(s_or_f, b); end; Close(f); if f2 = 1 then begin fname := fname2; f2 := 2; end; until f2 = 0; end; procedure Mv(comu:string); {перенос файлов} const rs = 512; var keys, fname1, fname2, f: string; f1, f2: file; nr, nw: word; buf: array [1..rs] of char; i, r: boolean; yn: char; Begin if error(comu) then exit; delete(comu, 1, 3); if error(comu) then exit; keys := ''; if pos('-', comu) <> 0 then begin keys := copy(comu, 1, pos(' ', comu)); delete(comu, 1, pos(' ', comu)); end; if pos('i', keys) <> 0 then i := true else i := false; if pos('f', keys) <> 0 then r := true else r := false; fname1 := copy(comu, 1, pos(' ', comu) - 1); delete(comu, 1, pos(' ', comu)); fname2 := comu; if fname2[length(fname2)] = '\' then begin f := fname1; while pos('\', f) <> 0 do delete(f, 1, pos('\', f)); fname2 := fname2 + f; end; if fname1 = fname2 then begin writeln('Oдинаковые имена файла источника и приемника!'); exit; end; {$i-} assign (f1, fname1); reset (f1, 1); {$i+} if ioresult <> 0 then begin writeln ('Файл - источник не найден!'); exit; end; assign (f2, fname2); {$i-} reset(f2); {$i+} if (ioresult = 0) and (i or (not r)) then begin repeat write('файл ', fname2, ' уже существует. перезаписать? (y/n) '); readln(yn); until upcase(yn) in ['y', 'n']; if upcase(yn) = 'y' then rewrite(f2, 1) else begin close(f1); close(f2); exit; end; end else rewrite(f2, 1); repeat blockread(f1, buf, rs, nr); blockwrite(f2, buf, nr, nw); until (nr = 0) or (nw <> nr); close(f1); close(f2); erase(f1); writeln ('Файл перенесен!'); End; Procedure Man (comu:string); Begin Delete(comu, 1, 4); case Unix_num (comu) of 1:begin WriteLn('Справка по: LS'); WriteLn('Выводит список файлов в каталоге.'); WriteLn('Если каталог не указан, то исп. текущий каталог.'); WriteLn('Вызов:'); WriteLn('ls - 1lRap каталог'); WriteLn('-R - рекурсивный просмотр'); WriteLn('-1 - вывод информации о каждом файле или каталоге с новой строки'); WriteLn('-l - расширенная информация о файлах'); WriteLn('-a - вывод информации о всех файлах и каталогах'); WriteLn('-p - вывод наклонной черты в конце имени каталога'); end; 2:begin WriteLn('Справка по: DIRCMP'); WriteLn('Сравнение содержимого двух каталогов и'); WriteLn('вывод информации об отличиях.'); WriteLn('Вызов:'); WriteLn('dircmp каталог_1 каталог_2'); end; 3:begin WriteLn('Справка по: TR'); WriteLn('Выполнение процедуры поиска и замены.'); WriteLn('Вызов:'); WriteLn('tr строка_1 строка_2'); end; 4:begin WriteLn('Справка по: COMM'); WriteLn('Построчное сравнение содержимого 2-х текстовых файлов.'); WriteLn('Вывод производится в три столбца:'); WriteLn(' строки, содержащиеся в первом файле, '); WriteLn(' строки, содержащиеся во втором файле, '); WriteLn(' строки, содержащиеся в обоих файлах.'); WriteLn('Вызов:'); WriteLn('comm - 123 файл_1 файл_2'); WriteLn('-1 - запрет вывода 1-ого столбца'); WriteLn('-2 - запрет вывода 2-ого столбца'); WriteLn('-3 - запрет вывода 3-его столбца'); WriteLn('-12 - вывод только 3-его столбца'); WriteLn('-13 - вывод только 2-ого столбца'); WriteLn('-23 - вывод только 1-ого столбца'); end; 5:begin WriteLn('Справка по: RMDIR'); WriteLn('Удаление каталога. Удаляемый каталог не должен'); WriteLn('содержать файлов или подкаталогов.'); WriteLn('Вызов:'); WriteLn('rmdir - ps каталог'); WriteLn('-p - удалить указанный каталог и его род. каталог'); WriteLn('-s - запрет вывода сообщений об ошибках'); end; 6:begin WriteLn('Справка по: CAT'); WriteLn('Вывод содержимого файлов.'); WriteLn('Вызов:'); WriteLn('cat имя_файла'); WriteLn('> - объединить несколько файлов в один, '); WriteLn('>> - присоединить файл к существующему, '); WriteLn('-s - запрет вывода пустых строк.'); end; 7:begin WriteLn('Справка по: MV'); WriteLn('Переименование файла или перемещение одного либо'); WriteLn('нескольких файлов в другой каталог.'); WriteLn('Вызов:'); WriteLn('mv - fi исходный_файл_1 конечный_файл_2'); WriteLn('-f - запрет запроса подтверждений, '); WriteLn('-i - требование запроса подтверждения.'); end; 8, 10:begin WriteLn('Описание команд ОС UNIX'); WriteLn('man имя_команды'); WriteLn('Список доступных команд: '); WriteLn('ls, dircmp, tr, comm, rmdir, cat, mv'); WriteLn('Выход - команда exit'); end; else WriteLn('Отсутствует описание этой команды.'); end; End; BEGIN WriteLn('-> Эмулятор команд ОС UNIX <-'); Repeat Write('$ '); ReadLn(comu); Spaces(comu); Reout(comu); case Unix_num (comu) of 1:Ls(comu); 2:Dircmp(comu); 3:Tr(comu); 4:Comm(comu); 5:Rmcat(comu); 6:Cat(comu); 7:Mv(comu); 8:Man(comu); 9:Break; else WriteLn('Неизвестная команда!'); end; Close(s_or_f); Until False; END. Для подготовки данной работы были использованы материалы с сайта http://referat.ru/ |
Страницы: 1, 2
![]() |
||
НОВОСТИ | ![]() |
![]() |
||
ВХОД | ![]() |
|
Рефераты бесплатно, реферат бесплатно, курсовые работы, реферат, доклады, рефераты, рефераты скачать, рефераты на тему, сочинения, курсовые, дипломы, научные работы и многое другое. |
||
При использовании материалов - ссылка на сайт обязательна. |