Автор работы: Пользователь скрыл имя, 06 Февраля 2014 в 10:27, курсовая работа
В данной курсовой работе будут описаны некоторые особенности файловой системы Unix, а также программно реализованы некоторые команды ОС Unix в среде ОС Windows.
Введение………………………………………………………………….…….………..5
1 Описание файловой системы Unix………………………………………………….6
2 Постановка задачи…………………………………………………………………….8
3 Описание команд и сравнение их с родственными…………………………………8
4 Выбор средств реализации…………………………………………………………..10
5 Программная реализация эмулятора………………………………………………..12
5.1 Структурная схема алгоритма используемого в программе……………...12
5.2 Модульная структура программы…………………………………………..13
5.3 Описание диалога с пользователем………………………………………...14
Заключение………………………………………….………………………….………17
Список литературы………………………………………………………………….…18
Приложение А……………………………………………………………………….....19
Reset(var F [: File; RecSize: Word ] ) открывает существующий файл, связанный с файловой переменной F. Параметр RecSize задается для нетипизированных файлов и устанавливает длину записи в байтах.
Также были использованы некоторые процедуры управления файлами:
FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer - выделяет в памяти необходимые ресурсы для поиска в каталоге и шаблоне Path (например, c:\MyDir\*.*) файлов, удовлетворяющих шаблону и имеющих атрибуты Attr (см. FileSetAttr]. При успешном завершении возвращает 0, в противном случае - код ошибки Windows. Результаты поиска заносятся в запись SearchRec. Из полей этой записи можно извлечь результаты: Time: Integer — время создания файла, Size: Integer — его размер, Attr: Integer — его атрибуты, Name — имя файла и некоторые другие.
FindNextfvar F: TSearchRec): Integer - продолжает поиск, начатый функцией FindFirst. Если нашелся новый файл, возвращает 0, в противном случае — код ошибки Windows. Результаты поиска заносятся в запись SearchRec .
Итак на мой взгляд были подобраны оптимальные средства реализации поставленной задачи, что позволит максимально приблизить по функциональности наше приложение с командной строкой Unix.
5 Программная реализация эмулятора
5.1 Описание программы
Рисунок 1 – структурная схема алгоритма используемого в программе
5.2 Модульная структура
Данную программу можно условно разделить на 3 модуля.
1. Интерфейс.
2. Модуль ввода данных.
3. Модуль выполнения команд.
Рисунок 2 – монолитно-модульная структура программы
1. Интерфейс представляет собой форму, на которой компонент Memo, через данный модуль осуществляется диалог с пользователем.
2. Модуль ввода содержит
в себе процедуры, с помощью
которых вводятся начальные
3. Модуль выполнения команд представляет собой набор процедур и функций, через которые осуществляется непосредственное выполнение необходимых операций над файлами. Данный модуль условно можно разделить еще на 8 частей, которые будут соответствовать командам. Выходными данными для данного модуля является либо стандартный текст, либо выходной файл в случае перенаправления вывода.
5.3 Описание диалога с пользователем
1. Для запуска программы
необходимо открыть файл KursOS
Рисунок 3 – вид формы после запуска
2. Далее пользователю следует ввести команду ключ и необходимые параметры. Если что то будет введено не корректно, появятся соответствущие сообщения об ошибках:
Рисунок 4 – сообщения об ошибках.
Следует заметить что последняя ошибка возникает лишь в том случае когда введена команда которая работает только с 2 файлами (например команды ср comm, cmp).
Далее будет приведено несколько примеров работы программы и выполнения команд.
Рисунок 5 – выполнение команды cat и wc.
Рисунок 6 – выполнение команды cmp man и cp.
Следует заметить что команда ср была выполнена с ключом «-i»,поэтому программа выдала соответствующий запрос о выполнении операции:
Рисунок 7 – запрос на подтверждения копирования.
Рисунок 8 – выполнение команды egrep и comm, а также реализация мета символов.
Также в данном приложении
реализовано перенаправление
Заключение
Главным итогом выполнения курсовой работы по дисциплине «Операционные» на тему «Эмуляция командного процессора ОС Unix в среде ОС Windows» является разработка программы реализующей решение поставленной задачи.
Для решения поставленной задачи была выбрана среда быстрой разработки приложений Delphi 7. На мой взгляд это наиболее удобный способ добиться решения задачи такого уровня в поставленные сроки. Простой интерфейс написанный на самом же Delphi, удобная пошаговая отладка – это далеко не все преимущества этой среды. Работа по созданию программы помогла мне более глубже изучить среду программирования Delphi . Подводя итог можно сказать, что поставленная задача успешно решена. Мы имеем отлично функционирующее приложение с понятным и доступным интерфейсом.
1. А.Я. Архангельский Программирование в Delphi7. - М.: Бином 2003.–1152 с.
2. . С.Л.Скловская. - Команды Linux. Справочник, 3-е изд., псрераб. и доп.
СПб.: ООО «ДиаСофтЮП», 2004. - 848 с.
3. Е.Н.Королев. – Эмуляция командного процессора. Методические указания по курсу операционные системы. Воронеж 2004 – 23 с.
Приложение А
Листинг программы
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Листинг модуля:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,math;
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure Memo1KeyPress(Sender: TObject; var Key: Char);
procedure Memo1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
i,j,k,flag,w:integer;
wfail: boolean;
par,s,ST,comand, kl,str,str1: string;
fil: Array [1..50] of TextFile;
outfil: TextFile;
imaf: Array [1..50] of string;
F:TsearchRec;
implementation
{$R *.dfm}
procedure vvodvivod;
begin
if imaf[k-1]='>' then
begin
rewrite(fil[k]);
w:=k;
k:=k-2;
wfail:=true;
end;
end;
Procedure parametr;
Var atr: integer;
begin
s:=''; k:=0; i:=1;
for i:=1 to length(par) do
begin
if par[i]=' ' then continue;
s:=s+par[i];
if (par[i]<>' ') and ((par[i+1]=' ') or (i=length(par))) then
begin
inc(k);
imaf[k]:=s;
s:='';
end;
end;
if comand='egrep' then str:=imaf[1];
if (imaf[1]='*.txt') or (imaf[1]='*.pas') or ((comand='egrep') and (imaf[2]='*.txt') or (imaf[2]='*.pas'))
then
begin
if imaf[k-1]='>' then begin s:=imaf[k]; wfail:=true; end;
k:=1;
atr:=fadirectory;
GetDir(0,st);
if (imaf[1]='*.txt') or ((comand='egrep')and(imaf[2]='
if (imaf[1]='*.pas') or ((comand='egrep')and(imaf[2]='
AssignFile(fil[1],F.Name);
imaf[1]:=F.Name;
if comand='egrep' then begin
imaf[2]:=F.Name;
AssignFile(fil[2],F.Name);
k:=2;
end;
while findNext(F)=0 do
begin
if F.Name=s then continue;
inc(k);
AssignFile(fil[k],F.Name);
imaf[k]:=F.Name;
end;
end else For i:=1 to k do
AssignFile(fil[i],imaf[i]);
if wfail= true then begin
imaf[k+1]:='>';
imaf[k+2]:=s;
k:=k+2;
AssignFile(fil[k],s);
end;
if (comand='dc') and (imaf[k-1]='>') and (imaf[k]<>'') then AssignFile(fil[k],imaf[k]);
end;
procedure proverka;
begin
if FileExists(imaf[j])=false then
begin
showMessage('Файла с таким именем не существует');
flag:=10;
end;
end;
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
var
pos,shet,kstrok,wsesim,wsestr,
s1,s2,resul:real;
begin
if key=#13 then
begin
flag:=0;
comand:=''; st:='';
kl:=''; wfail:=false; ksovp:=0;
par:=''; b:=1; nsim:=0; vsesovp:=0;
kstrok:=0; kslov:=0; shet:=0;wsesim:=0; wsestr:=0;wseslov:=0;
pos:=memo1.CaretPos.y;
For i:=1 to length(memo1.Lines.Strings[
begin
if (memo1.Lines.Strings[Pos][i]=' ') or (memo1.Lines.Strings[Pos][i]='
begin
if flag=2 then par:=par+memo1.Lines.Strings[
if (flag=2) and (par<>'') and (memo1.Lines.Strings[pos][i+1]
if flag=1 then
begin
kl:=kl+memo1.Lines.Strings[
if (kl[1]<>'-') then begin
flag:=2;
par:=kl[1];
kl:='';
if memo1.Lines.Strings[pos][i+1]=
end;
if memo1.Lines.Strings[pos][i+1]=
end;
if flag=0 then begin
comand:=comand+memo1.Lines.
if memo1.Lines.Strings[pos][i+1]=
end;
end;
end;
parametr;
vvodvivod;
flag:=0;
if comand='wc' then flag:=1;
if comand='cmp' then flag:=2;
if comand='egrep' then flag:=3;
if comand='dc' then flag:=4;
if comand='cat' then flag:=5;
if comand='comm' then flag:=6;
if comand='cp' then flag:=7;
if comand='man' then flag:=8;
case flag of
0: begin
ShowMessage('Один из параметров введен не верно или не введен совсем!');
Exit;
end;
1:{wc}
begin
if (kl<>'-w') and (kl<>'-c') and (kl<>'')
and (kl<>'-l') then begin
showMessage('Неверный ключ') ;
exit;
end;
if kl='' then flag:=0;
if kl='-c' then flag:=1;
if kl='-l' then flag:=2;
if kl='-w' then flag:=3;
For j:=1 to k do
begin
kstrok:=0; kslov:=0; shet:=0;
proverka;
if flag=10 then exit;
Reset(fil[j]);
while Eof(fil[j])<>true do
begin
readln(fil[j],str);
shet:=shet+length(str);
kstrok:=kstrok+1;
For i:=1 to length(str)do
if (str[i]<>' ') and ((str[i+1]=' ') or (i=length(str))) then kslov:=kslov+1
end;
case flag of
0:if wfail=false then
memo1.Lines.Add(inttostr(
writeln(fil[w],inttostr(
1:if wfail=false then memo1.Lines.Add(inttostr(shet)
writeln(fil[w],inttostr(shet)+
2:if wfail=false then memo1.Lines.Add(inttostr(
writeln(fil[w],inttostr(
3:if wfail=false then memo1.Lines.Add(inttostr(
writeln(fil[w],inttostr(kslov)
end;
wsesim:=wsesim+shet;
wsestr:=wsestr+kstrok;
wseslov:=wseslov+kslov;
closeFile(fil[j]);
end;
if k>1 then
case flag of
0:if wfail=false then
memo1.Lines.Add(inttostr(wsest
writeln(fil[w],inttostr(
1:if wfail=false then memo1.Lines.Add(inttostr(
writeln(fil[w],inttostr(
2:if wfail=false then memo1.Lines.Add(inttostr(
writeln(fil[w],inttostr(
3:if wfail=false then memo1.Lines.Add(inttostr(
writeln(fil[w],inttostr(
end;
if wfail=true then closeFile(fil[w]);
end;
2:begin {cmp}
if (kl<>'-l') and (kl<>'') then begin
exit;
if k<>2 then begin
showMessage('колличество файлов должно быть равно 2');
exit
end;
if kl='' then flag:=0;
if kl='-l' then flag:=1;
Reset(fil[1]);
Reset(fil[2]);
while (Eof(fil[1])<>true) or (Eof(fil[2])<>true) do
begin
inc(kstrok);
readln(fil[1],str);
readln(fil[2],str1);
case flag of
0:for i:=1 to max(length(str1),length(str)) do
if str[i]<>str1[i] then
begin
if wfail=false then memo1.Lines.Add('Line: '+inttostr(kstrok)+' char: '+inttostr(i))else
writeln(fil[w],'Line: '+inttostr(kstrok)+' char: '+inttostr(i));
if wfail=true then closeFile(fil[w]);
exit;
end;
1:begin
i:=1; j:=1; nsim:=1;
while (flag<>3)do
begin
st:=inttostr(nsim-1)+' '+inttostr(ord(str[i]))+' '+inttostr(ord(str1[j]));
if str[i]<>str1[j] then if wfail=false then memo1.Lines.Add(st) else
if i>length(str) then begin
readln(fil[1],str);
i:=1;
end;
if j>length(str1) then begin
readln(fil[2],str1);
j:=1;
end;
if ((Eof(fil[1])=true) and (i>length(str))) or
((Eof(fil[2])=true) and (j>length(str1))) then exit;
inc(i);inc(j);inc(nsim);
end;
end;
end;
end;
if wfail=true then closeFile(fil[w]);
end;
3: begin {egrep}
if kl='' then flag:=1;
if kl='-b' then flag:=2;
if kl='-c' then flag:=3;
if (kl<>'-b') and (kl<>'-c') and (kl<>'') then begin
For j:=2 to k do
begin
shet:=1; b:=0;
proverka;
if flag=10 then exit;
Reset(fil[j]);
while Eof(fil[j])<>true do
begin
readln(fil[j],str1);
For i:=1 to length(str1) do
begin
inc(b);
if (length(str)=1) and (str1[i]=str[1]) then