|
||||||||||||
|
||||||||||||
|
|||||||||
МЕНЮ
|
БОЛЬШАЯ ЛЕНИНГРАДСКАЯ БИБЛИОТЕКА - РЕФЕРАТЫ - Интерпретатор команд MS DOSИнтерпретатор команд MS DOS27 Волжский университет имени В.Н.Татищева Факультет “Информатика и телекоммуникации” Кафедра “Информатика и системы управления” КУРСОВАЯ РАБОТА по дисциплине: “Системное программное обеспечение” Тема: “Интерпретатор команд MS DOS” Тольятти Содержание
Ещё одна программа, которую можно считать частью DOS,- это загрузчик DOS. Он находится в первом секторе каждой дискеты и в первом секторе логического диска, с которого происходит загрузка DOS (то есть диска С:). Название этой очень короткой программы- загрузка в память системного файла DOS IO.SYS при начальной загрузке компьютера. 1.1.5 Диалог пользователя с DOSДиалог пользователя с DOS осуществляется в форме команд-строк символов, вводимых с клавиатуры. Каждая команда пользователя означает, что DOS должна выполнить то или иное действие, например, напечатать файл или выдать на экран оглавление каталога. Команды DOS состоит из имени команды или вызываемой программы и, возможно, параметров, разделённых пробелами. Ввод каждой команды заканчивается нажатием клавиши ENTER. 1.1.6 Команды DOSЛюбая команда, вводимая пользователем в MS DOS, вызывает выполнение либо внутренней команды (из COMMAND.COM) либо какой-либо программы или командного файла.Команды DOS состоят из имени команды и, возможно, параметров разделённых пробелами. Имя команды и параметры могут набираться как прописными, так и строчными латинскими буквами. Ниже полностью описаны три команды DEL,REN,COPY, подробная характеристика, примеры правильного написания для работы с ними. Моя программа интерпретирует их с небольшими изменениями.Для удаления файлов в DOS имеется команда DEL.Формат команды:DEL Имя файлаВ имени файла можно употреблять символы * и ?.Примеры:DEL *.bak-удаление всех файлов с расширением bak из текущего каталога.DEL my.txt- удаление файла my.txt из текущего каталога.Для переименования файлов в DOS имеется команда REN. Формат команды:REN имя-файла1 имя-файла2Параметры. Параметр имя-файла1 задает имя переименуемого файла, параметр имя-файла2 -новое имя файла.Примеры:REN xxx.doc xxx.txt -переименование файла ххх.doc в текущем каталоге. Новое имя файла xxx.txt.Для переименования файлов в DOS имеется команда COPY. Формат команды:COPY имя-файла1 имя-файла2В имени файла можно употреблять символы * и ?, а также указывать имя диска и каталога.Выполнение команд. Если в параметре имя-файла1 указанно имя каталога, то файлы копируются из этого каталога в, иначе - из текущего каталога. Каталог, в котором копируются файлы, можно задать параметром имя-файла2 или указанием каталога в параметре имя-файла2. Если этот каталог не задан, то файлы копируются в текущий каталог.Если во втором параметре команды задано имя файла, то оно указывает новое имя копируемого файла. Символы * и ? в имени файла во втором параметре команды указывают, что соответствующие символы в именах копируемых файлов при копировании не меняются. Примеры: COPY xxx.doc xxx.txt -копирование файла ххх.doc в текущем каталоге; создаётся файл xxx.txt в текущем каталоге. COPY a:\*.* - копирование всех файлов из корневого каталога диска а: в текущий каталог. COPY a:\*.* d: -- копирование всех файлов из корневого каталога диска а: в текущий каталог диска D:. COPY \t\*.doc c:\*.txt - копирование всех файлов с расширением.doc из каталога \t текущего диска в текущий каталог диска с:. Файлы получают расширение txt. Если файл с таким же именем, как у копии, создаваемой командой COPY, уже существует, то он замещается без каких либо предупреждений. 1.2 Особенности языка програмирования С++С++ программно независимый язык. На языке С++ пишутся операционные системы, различные программы и т.д. При написании своей программы я столкнулся с одной проблемой - это работа со строками, чтобы выполнить определённую задачу мне приходилось добавлять в программу ещё несколько или больше функций для устранения ошибок. Например:for (i=0;i<strlen(lptr);i++){ Разделение сткоки на два параметраif (lptr[i]==' ')break; Копирование в ff до пробелаff[i]=lptr[i];}strncat(fs,ff,i); В ff копируется посимвольно строка размером i, но при просмотре новой строки оказывалось символов не i, а в несколько раз больше, приходилось использовать strncat, она вырезает не нужные символы. И так почти на каждом шагу были проблема. Это мои первые замечания по ошибкам, возможно их прибавится.2. Программная часть2.1 Постановка задачи Перед началом выполнения данной курсовой работы я поставил для себя целью изучить принципы работы с файлами в операционной системе DOS, команды, позволяющие работать с файлами, а также функции и системные вызовы языка С++, позволяющие копирование, удаление, переименование файлов, работа с командной строкой. В данной работе я постаралась наиболее подробно изучить операционную систему DOS в программируемой части и частично других операционных систем, получить практические навыки работы с операционной системой DOS. В курсовой работе я буду создавать и описывать программу, которая позволит работать с файлами, а именно, копировать, переименовывать и удалять. Данная программа в дальнейшем может быть использована студентами для изучения работы с файлами на лабораторных занятиях по изучению теоретического материала и приобретения практических навыков по дисциплине «Системное Программное Обеспечение», а также программа может быть использована в работе с операционной системой MS DOS.2.2 Построение алгоритма решения задачиАлгоритм решения поставленной задачи, выполненный с помощью графического метода изображения алгоритмов - блок-схемой представлен ниже. Алгоритм программыДля реализации моей задачи используется следующий алгоритм (рисунок 1.).Описание алгоритма:Ввод команды с клавиатурыИндификация вводимой командыОперации над параметрами командыВыполнение командыРис. 1. Алгоритм программы.2.3 Описание разработанной программыМоя программа интерпретирует команды MS DOSВ программе можно пользоваться четырьмя командами:Exit- программа завершается.Copy - копирование файла или файлов.Ren -переименование файла.Del -Удаление файла.В программе я использую встроенные библиотеки С++. Таб. 1В основном программа работает со строковыми функциями. Эти функции нужны для обработки строк с клавиатуры, для устранения ошибок С++. strtok -для устранения ошибок в строкеstrncat -копирует определённое количество символов в переменную.strstr - для поиска слова в строке. strcpy -копирует строку в переменную. strcat -добавляет строку в переменную.Strrev- реверсирует строку. Strlen- определяет количество символов в строкеStrlwr-все символы преобразовывает в строчные.Strpbrk- ищет определённые символы.Почти в любой программе не обойдешься без собственных функций, они упрощают программирование, программа становится более понятна и удобна в изучении. В моей программе я использую шесть своих функций FILCOP, GAD, GIP, DELFILE, RENFILE, COPYES.Filcop - функция для копирования файлов. Gad - функция для выреза одного пути без имени файла из строки.Gip - функция для выреза одного имени файла из строки.Delete- функция удаления файлов.Renfile- функция переименования файлов.Copyes- функция обрабатывающая строку и вызова функции Filcop. Она разделяет строку на два параметра копирования- какой файл и куда копировать с учётов шаблонов (*?).После загрузки программы появится меню с приглашением «>>>>». Теперь можно вводить команды. После ввода команды программа определяет её.Если:EXIT - программа завершается.REN -оставляет в введённой строке только два параметра (какой файл, на какой переименовывать) и вызывает функцию Renfile.Copy- оставляет в введённой строке только два параметра (какой файл, куда копировать и что), вызывает функцию Copyes. Del- оставляет в введённой строке только один параметр (какой файл) и вызывает функцию Delete.В программе в основном я работаю со строковыми переменными и функциями для вырезания путей с файлами, путей, и т.д. Это всё нужно, чтобы использовать шаблоны в некоторых командах (Copy,delete).
В данной курсовой работе были рассмотрены команды MS DOS, позволяющие копировать, удалять, переименовывать файлы. А также функции и системные вызовы языка С++, позволяющие организовывать копирование, удаление файлов и т.д. Данная работа позволила мне более углубленно изучить работу с строковыми функциями, различные тонкости языка и увидеть недостатки С++. В курсовой работе была создана и описана программа, позволяющая работать с файлами в среде MS DOS. Данная программа может быть использована студентами для изучения работы с файлами в среде MS DOS и частично с UNIX, на лабораторных занятиях по изучению теоретического материала и приобретения практических навыков по дисциплине «Системное Программное Обеспечение». 4. СПИСОК ЛИТЕРАТУРЫГерхард Франкен, Сергей Молявко MS DOS для пользователя.- Киев, 1993.С. Краковяк Основы организации и функционирования ОС ЭВМ.- М.: Мир, 1998.С. Кейслер Проектирование операционных систем для малых ЭВМ. - М.: Мир, 1996.Э. Немет, Г. Снайдер Unix. Руководство системного администратора. - Киев.: BHV, 1997.Дегтярев Е.К. Введение в Unix.- М.: Память, 1992.Свиридов С.В. Системные вызовы ОС UNIX.-М.:Память, 1992.Дунаев С. UNIX-сервер. Настройка, конфигурирование, работа в операционной среде, Internet-возможности: в 2-х томах.Том 1.-М.:Диалог -МИФИ, 1999.Дунаев С. UNIX-сервер. Настройка, конфигурирование, работа в операционной среде, Internet-возможности: в 2-х томах.Том 2.-М.:Диалог -МИФИ, 1999.Шамер Л., Негус К. UNIX (серия «Без проблем»):Пер. с англ. -М.:Бином, 1998.Кейлингерт П. Элементы операционных систем. Введение для пользователей. Пер. с англ.-М.:Мир,1995.Персон Р. Windows 95 в подлиннике. Пер. с англ.-СПБ:BHV-Санкт -Петербург, 1996.5. Приложение#include <iostream.h> #include <stdio.h> #include <conio.h> #include <math.h> #include <string.h> #include <ctype.h> #include <stdlib.h> #include <dir.h> //Процедура для копирования файла //FILCOP---------------------------------------------------------------------- int FILCOP(char *sd,char *sf) { FILE *in, *out; in = fopen(sd, "r"); открывает фаил и копирует в буфер содержимое out = fopen(sf, "w"); открывает или создаёт фаил while (!feof(in)) fputc(getc(in), out); заполняет новый фаил fclose(in); fclose(out); закрывает фаил return(0); возрашет функции значение 0 } Функция для создания полного пути //ANY---------------------------------------------------------------------- char *GAD(char *sm, char *namf) { char *zzx,kr[254],*newfil; kr[0]='\0'; устанавливаем переменые zzx=strpbrk(sm,"\\"); ишет "\" if (zzx) { если есть strcpy(kr,sm); копирует в kr путь без имени файла strrev(kr); реверс строки newfil = strstr(kr, "\\"); отрезает до "\" strrev(newfil); реверс строки strcat(newfil,namf); добовляет имя файла в путь strlwr(newfil); уменьшает символы return newfil; } else return namf; } Функция для вырезки только путя //ANY55---------------------------------------------------------------------- char *GIP(char *sm) { char *zzx,kr[254],*newfil; kr[0]='\0'; устанавливаем переменые zzx=strpbrk(sm,"\\"); ишет "\" if (zzx) { если есть strcpy(kr,sm); копирует в kr путь без имени файла strrev(kr); реверс строки newfil = strstr(kr, "\\"); отрезает до "\" strrev(newfil);реверс строки strlwr(newfil);уменьшает символы return newfil; } else return sm; } Удаление фаил (а,ов) //DELFILE---------------------------------------------------------------------- DELFILE(char *sm) { //char *newfil, kr[254]; устанавливаем переменые struct ffblk ffblk; Структура о файле int done; done = findfirst(sm,&ffblk,0); ишет файлы if (done==-1) cout<<"\nError"; если путь неправельный- ошибка while (!done) ишет пока не кончатся файлы { if (remove(GAD(sm,ffblk.ff_name)) == 0) удаление файла cout<<"\n Delete 1 files"; вывод на экран текста else cout<<"\n File do not delete "; вывод на экран текста done = findnext(&ffblk); следующий файл } return (0); } Переименование фаила //RENAME---------------------------------------------------------------------- RENFILE(char *sm,char *nm) { strcpy(kr,sm); копирует в kr путь без имени файла strrev(kr); реверс строки newfil = strstr(kr, "\\"); отрезает до "\" strrev(newfil);реверс строки strlwr(newfil);уменьшает символы if (rename(sm, nm) == 0) Фу Переименование фаила cout<<"File renamed"; вывод на экран текста else cout<<"File do not renamed"; вывод на экран текста return (0); } //COPY---------------------------------------------------------------------- COPYES(char *sm) { char *nnj,zt[254],zt2[254]; int ji=0,jiz=0; установка перемен //ON>>>>TWO************************************************ char ff[254],fs[254],*ptr7,ffg[254],fss[254]; fs[0]='\0'; fss[0]='\0'; установка перемен strcpy(kr,sm); копирует в kr путь без имени файла strrev(kr); реверс строки newfil = strstr(kr, "\\"); отрезает до "\" strrev(newfil);реверс строки strlwr(newfil);уменьшает символы Разделяем строку два параметра на первый for (int i=0;i<strlen(sm);i++){ if (sm[i]==' ')break; ff[i]=sm[i];} strncat(fs,ff,i); ptr7 = strstr(sm, " "); Чтобы ошибок небыло Разделяем строку два параметра на первый for (i=1;i<strlen(ptr7);i++){ if (ptr7[i]==' ')break; ffg[i-1]=ptr7[i];} strncat(fss,ffg,i-1); Чтобы ошибок небыло //****************************************************** char nbb[254]; уст перемен Если есть * if (strpbrk(fss,"*")){ strrev(fss); nbb[0]='\0'; реверс FSS for (int q=0;q<strlen(fss);q++){ Разделение на путь и фаил if (fss[q]!='\\') nbb[q]=fss[q];else break; } копируем в NBB путь strrev(fss);strrev(nbb); Реверсы //cout<<"\n REEEEE--- "<<nbb; } //____________________________________________________________ char dt[254],dt2[254]; dt[0]='\0'; dt2[0]='\0'; int fll=0,ii=-2; уст перемен Разделяем строку фаил на наз и расширение for (int q=0;q<strlen(nbb);q++){ цикл if (nbb[q]=='.') fll=1; Если точка то флаг 1 if (fll==0) {dt[q]=nbb[q]; } Если 0 копируем в DT if (fll==1) {ii++;dt2[ii]=nbb[q]; } Если 1 копируем в DT2 } //____________________________________________________________ //cout<<"\n REEEEE111--- "<<dt; //cout<<"\n REEEEE222--- "<<dt2; //--------------------------------------------------------------------------- struct ffblk ffblk; Структура о файле int done; done = findfirst(fs,&ffblk,0); ишет фаилы if (done==-1) cout<<"\nError"; если нет то ошибка while (!done) начало поиска { //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ zt[0]='\0'; zt2[0]='\0'; fll=0;ii=-2;nnj=ffblk.ff_name; ji=0;jiz=0; Установка перемен Разделение первого пар файла на имя и расширение for (q=0;q<strlen(nnj);q++){ цикл if (nnj[q]=='.') fll=1; если точка то флаг 1 if (fll==0) {ji++;zt[q]=nnj[q]; } Если 0 копируем в ZT if (fll==1) {jiz++;ii++;zt2[ii]=nnj[q]; } } Если 1 копируем в ZT2 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ zt[ji]='\0'; zt2[jiz-1]='\0'; char *rrr; rrr=NULL; Обнулить перем char *path2,bpn[254]; установка перем path2=GIP(fss); Обработка моей функции bpn[0]='\0'; strcpy(bpn,path2); копир в BPN Если во втором параметре есть звёздочки то из первого парам заменяется второй Замена у второго параметра имени именем первого параметра if (dt[0]!='*'){ strcat(bpn,dt); strcat(bpn,"."); } else { strcat(bpn,zt); strcat(bpn,"."); } if (dt2[0]!='*') strcat(bpn,dt2); else strcat(bpn,zt2); Замена у второго параметра расширения расширением первого параметра strlwr(bpn); уменьшение символов strcpy(kr,sm); копирует в kr путь без имени файла strrev(kr); реверс строки newfil = strstr(kr, "\\"); отрезает до "\" strrev(newfil);реверс строки strlwr(newfil);уменьшает символы FILCOP(GAD(fs,ffblk.ff_name),bpn); Обработка моей функции и копирование done = findnext(&ffblk); следующий фаил } //--------------------------------------------------------------------------- return (0); } //MAIN---------------------------------------------------------------------- void main() { char s[254],*ptr,*lptr; установка переменных gotoxy(16,0); установка текста в опред. части экрана cout<<"Interpretator commands DOS (COPY,DEL,REN)"; вывод на экран текста gotoxy(0,23); установка текста в опред. части экрана Enter: метка cout<<"\n>>>"; вывод на экран текста gets(s); strlwr(s); чтение с клавиатуры и уменшение символов //++++++++++++++++DEL================== strcpy(kr,sm); копирует в kr путь без имени файла strrev(kr); реверс строки newfil = strstr(kr, "\\"); отрезает до "\" strrev(newfil);реверс строки strlwr(newfil);уменьшает символы ptr = strstr(s, "del "); ишет "del " if (strlen(ptr)!=0) { если есть strcpy(s, ptr); копирует строку в S int i,vb=-1; char sg[254]; установка переменных for (i=4;i<strlen(s);i++){ Удаляет "del " vb++; sg[vb]=s[i]; заносит в sg } lptr=NULL; обнуляет lptr lptr=strtok(sg,""); Чтобы ошибок не было DELFILE(lptr); Собственная функция } //++++++++++++++++REN================== ptr = strstr(s, "ren "); ищет "ren " if (strlen(ptr)!=0) { если есть strcpy(s, ptr); копирут строку в S int i,vb=-1; char sg[254]; установка переменных for (i=4;i<strlen(s);i++){ удаляет "ren " vb++; sg[vb]=s[i]; заносит в SG } lptr=NULL; обнуляет lptr lptr=strtok(sg,""); Чтобы ошибок не было //*************************************************** char ff[254],fs[254],*ptr7,ffg[254],fss[254]; устовка переменных fs[0]='\0'; fss[0]='\0'; обнуление for (i=0;i<strlen(lptr);i++){ Разделение сткоки на два параметра if (lptr[i]==' ')break; Копирование в ff до пробела ff[i]=lptr[i];} strncat(fs,ff,i); Чтобы ошибок не было ptr7 = strstr(lptr, " "); ишет пробел for (i=1;i<strlen(ptr7);i++){ Удаляет пробел и копирует в FFG if (ptr7[i]==' ')break; ffg[i-1]=ptr7[i];} strncat(fss,ffg,i); Чтобы ошибок не было //*************************************************** RENFILE(fs,fss); Собственная функция } //++++++++++++++++COPY================== ptr = strstr(s, "copy "); ешет "copy " if (strlen(ptr)!=0) { Удаляет "copy " strcpy(s, ptr); копирут строку в S int i,vb=-1; char sg[254]; Установка перем for (i=5;i<strlen(s);i++){ Удаляет copy vb++; sg[vb]=s[i]; копирует в SG } lptr=NULL; обнуляет lptr lptr=strtok(sg,""); Чтобы ошибок не было strcpy(kr,sm); копирует в kr путь без имени файла strrev(kr); реверс строки newfil = strstr(kr, "\\"); отрезает до "\" strrev(newfil);реверс строки strlwr(newfil);уменьшает символы ptr =strstr(lptr,"con "); ишет "con " if (ptr){ cout<<"\nNot is function, re-enter"; goto Enter; } Если есть выводит сообщение ptr =strstr(lptr,"+"); ишет + if (ptr){ cout<<"\nNot is function, re-enter"; goto Enter; } Если есть выводит сообщение COPYES(lptr); Собственная функция } //++++++++++++++++EXIT================== ptr = strstr(s, "exit"); ишет "exit" strcpy(kr,sm); копирует в kr путь без имени файла strrev(kr); реверс строки newfil = strstr(kr, "\\"); отрезает до "\" strrev(newfil);реверс строки strlwr(newfil);уменьшает символы if (strlen(ptr)!=0) exit(EXIT_FAILURE); если есть то выход программы goto Enter; на метку } |
РЕКЛАМА
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
БОЛЬШАЯ ЛЕНИНГРАДСКАЯ БИБЛИОТЕКА | ||
© 2010 |