Файл: Практическая работа по учебной дисциплине Операционные системы и оболочки.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 03.12.2023

Просмотров: 40

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Федеральное агентство связи

Федеральное государственное бюджетное образовательное учреждение

высшего образования

«Поволжский государственный университет телекоммуникаций и информатики»

___________________________________________________________________________

Кафедра Информационных систем и технологий


ПРАКТИЧЕСКАЯ РАБОТА

ПО УЧЕБНОЙ ДИСЦИПЛИНЕ
«Операционные системы и оболочки»

Выполнил студент:

Факультет ЗО курс 2 шифр 203121 гр. ИСТ -2к

Горелов Евгений Дмитриевич

«___» ____________2022 г.

Оценка___________ Дата ___________2022г.

Подпись преподавателя___________________

САМАРА 2022

Содержание


Содержание 2

1. Текст варианта задания 3

2. Описание назначения, ключей и параметров команд, подлежащих реализации согласно заданию 4

3. Описание алгоритмов реализации команд и алгоритма работы командного процессора (КП) 5

4. Исходные тексты процедур на языке программирования 7

5. Тестовые задания для проверки работы КП 17

6. Скриншоты выполнения команд реализованного КП 18

7. Список использованной литературы 26



1. Текст варианта задания


Необходимо реализовать некое подобие командного интерпретатора на любом языке программирования.Все ключи могут использоваться в любых интерпретациях или отсутствовать.

Во всех командах должен быть реализован ключ /? с выводом справки о команде на русском языке.

Необходимо реализовать команду Dir.

Ключи команды Dir для реализации: /o:n /a:r

Команда Dir должна показывать итоговую информацию – количество файлов и каталогов и суммарный объем файлов.

Остальные команды, подлежащие реализации: Attrib, date, cd

Реализуемые ключи дополнительных команд: Atrib +R –R


При вводе неверной команды должно выводиться сообщение об ошибке.

2. Описание назначения, ключей и параметров команд, подлежащих реализации согласно заданию


Команда dir отображает список файлов и подкаталогов каталога.

Параметр /o:n указывает на необходимость сортировки файлов и каталогов по алфавиту по имени.

Параметр /a:r позволяет вывести только файлы с атрибутом «только для чтения».

Возможно любое сочетание этих параметров.

Команда attrib позволяет отображать атрибуты файлов и задавать их.

Ключ +r позволяет установить атрибут «только для чтения».

Ключ -r позволяет снять атрибут «только для чтения» с файла.

Команда date отображает текущую системную дату.

Команда cd позволяет перейти из одного каталога в другой.


3. Описание алгоритмов реализации команд и алгоритма работы командного процессора (КП)


В качестве среды разработки была выбрана среда Visual Studio 2022 Community и соответствующий язык C#, как простое в плане разработки, и бесплатное решение.

Опишем кратко алгоритм работы программы.

В начале работы программы выполняется процедура Send, которая разделяет принятую текстовую строку на отдельные части.

В зависимости от полученного результата работа программы проходит по одному из следующих сценариев.

1. Если первый элемент полученного массива равняется «DATE» - проверяется количество аргументов. Если аргументов у процедуры нет – выводится текущая дата и предлагается установить новую дату.

Если у элемента есть аргумент, и он равен /? – выводится справочная информация по команде.

2. Если первый аргумент полученного массива равен «HELP» - выводится справка по всем содержащимся в программе процедурам.

3. Если аргумент равен «ATTRIB» - запоминается второй аргумент (имя файла), и проверяется наличие третьего аргумента.

Если он есть и равен «/?» - выводится справка по команде.

Если он есть и равен «+R» - для файла устанавливает артибут Read Only.

Если он есть и равен «-К» - c файла убирается атрибут Read Only.

Если его нету – просто выводится список текущих атрибутов файла.

4. Если аргумент равен «CD», проверяется чему равен второй аргумент.

Если он равен «?» - выводится справка.

Если он равен «..» - переходим на директорию выше и выводим директорию.

Если он содержит имя диска и «:» - происходит переход к этому диску.



4. Если аргумент равен «DIR» и нет дополнительных аргументов – происходит последовательное считывание названий файлов текущего каталога и их вывод на экран.

Если есть второй аргумент – происходит вывод содержимого этого каталога.

Если есть дополнительные аргументы – в соответствии с ними выводится содержимое нужного каталога.

5. Также реализованы дополнительные команды CLS (очистка экрана), LOG (вывод логов приложения).

Если работа не пошла ни по одному из указанных сценариев – на экран выводится сообщение об ошибке.


4. Исходные тексты процедур на языке программирования


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

using System.Runtime.InteropServices;
namespace Translator

{

[StructLayout(LayoutKind.Sequential)]

public struct SYSTEMTIME

{

public short wYear;

public short wMonth;

public short wDayOfWeek;

public short wDay;

public short wHour;

public short wMinute;

public short wSecond;

public short wMilliseconds;

}

class Interpreter

{

[DllImport("kernel32.dll", SetLastError = true)]

public static extern bool SetSystemTime(ref SYSTEMTIME st);
public string path;
public data Send(string command)

{

try

{

string com = command.Split(' ')[0].ToUpper();

string[] arg = command.Split(' ');
if (com == "DATE") {

if (arg.Length == 1)

{

Console.WriteLine("Текущая дата: {0}", DateTime.Now);

Console.Write("Установить дату (дд-мм-гг): ");

string s = Console.ReadLine();

SYSTEMTIME st = new SYSTEMTIME();

st.wYear = Convert.ToInt16(s.Split('-')[2]);

st.wMonth = Convert.ToInt16(s.Split('-')[1]);

st.wDay = Convert.ToInt16(s.Split('-')[0]);

st.wHour = 0;

st.wMinute = 0;

st.wSecond = 0;

SetSystemTime(ref st);

return new data("Дата обновлена!");

}

if (arg[1] == "/?")

return new data(File.ReadAllText("date.data"));

}

if (com == "HELP")

{

return new data(File.ReadAllText("help.data"));

}

if (com == "ATTRIB")

{

if (arg[1] == "/?")

return new data(File.ReadAllText("attrib.data"));

if (arg.Length == 3)

{

if (arg[2].ToUpper() == "+R")

{

File.SetAttributes(arg[1], System.IO.FileAttributes.ReadOnly);

return new data("Атрибут установлен");

}

if (arg[2].ToUpper() == "-R")

{

File.SetAttributes(arg[1], System.IO.FileAttributes.Normal);

return new data("Атрибут убран");

}

}

if (arg.Length == 2)

{

if (!arg[1].Contains(':'))

{

return new data(File.GetAttributes(path + "\\" + arg[1]).ToString() + " " + arg[1]);

}

return new data(File.GetAttributes(arg[1]).ToString() + " " + arg[1].Split('\\')[arg[1].Split('\\').Length - 1]);

}

}

if (com == "CD")

{

if (arg.Length == 2 && arg[1] == "..")

{

path = Path.GetDirectoryName(path);

return new data("$null");

}

if (arg[1] == "/?")

return new data(File.ReadAllText("cd.data"));

if (!arg[1].Contains(":"))

{

if (!Directory.Exists(path + "\\" + arg[1]))

return new data("Ошибка");

path += "\\" + arg[1];

return new data("$null");

}

if (Directory.Exists(arg[1]))

{

path = arg[1];

return new data("$null");

}

}

if (com == "DIR")

{

if (arg.Length == 1)

{

List filess = new List();

filess.AddRange(Directory.GetDirectories(path).ToList());

filess.AddRange(Directory.GetFiles(path).ToList());

foreach (string file in filess)

{

Console.WriteLine("{0} {1} {2} {3}", File.GetCreationTime(file).ToString(), IsDir(file), getSize(file), file.Split('\\')[file.Split('\\').Length - 1]);

}

return new data("$null");

}

if (arg[1] == "/?")

{

return new data(File.ReadAllText("dir.data"));

}

if (arg.Length == 2)

{

if (arg[1].ToUpper() == "/O:N")

{

List files = new List();

files.AddRange(Directory.GetDirectories(path).ToList());

files.AddRange(Directory.GetFiles(path).ToList());

files.Sort();

foreach (string file in files)

Console.WriteLine("{0} {1} {2} {3}", File.GetCreationTime(file).ToString(), IsDir(file), getSize(file), file.Split('\\')[file.Split('\\').Length - 1]);

return new data("$null");

}

else if (arg[1].ToUpper() == "/O:-N")

{

List files = new List();

files.AddRange(Directory.GetDirectories(path).ToList());

files.AddRange(Directory.GetFiles(path).ToList());

files.Sort();

files.Reverse();

foreach (string file in files)

Console.WriteLine("{0} {1} {2} {3}", File.GetCreationTime(file).ToString(), IsDir(file), getSize(file), file.Split('\\')[file.Split('\\').Length - 1]);

return new data("$null");

}

else if (arg[1].ToUpper() == "/A:R")

{

List files = new List();

files.AddRange(Directory.GetDirectories(path).ToList());

files.AddRange(Directory.GetFiles(path).ToList());

foreach (string file in files)

{

if (new FileInfo(file).IsReadOnly)

Console.WriteLine("{0} {1} {2} {3}", File.GetCreationTime(file).ToString(), IsDir(file), getSize(file), file.Split('\\')[file.Split('\\').Length - 1]);

}

return new data("$null");

}

}

if (arg.Length == 2)

{

List files = new List();

files.AddRange(Directory.GetDirectories(arg[1]).ToList());

files.AddRange(Directory.GetFiles(arg[1]).ToList());

foreach (string file in files)

{

Console.WriteLine("{0} {1} {2} {3}", File.GetCreationTime(file).ToString(), IsDir(file), getSize(file), file.Split('\\')[file.Split('\\').Length - 1]);

}

return new data("$null");

}

else if (arg[2].ToUpper() == "/O:N")

{

List files = new List();

files.AddRange(Directory.GetDirectories(arg[1]).ToList());

files.AddRange(Directory.GetFiles(arg[1]).ToList());

files.Sort();

foreach (string file in files)

Console.WriteLine("{0} {1} {2} {3}", File.GetCreationTime(file).ToString(), IsDir(file), getSize(file), file.Split('\\')[file.Split('\\').Length - 1]);

return new data("$null");

}

else if (arg[2].ToUpper() == "/O:-N")

{

List files = new List();

files.AddRange(Directory.GetDirectories(arg[1]).ToList());

files.AddRange(Directory.GetFiles(arg[1]).ToList());

files.Sort();

files.Reverse();

foreach (string file in files)

Console.WriteLine("{0} {1} {2} {3}", File.GetCreationTime(file).ToString(), IsDir(file), getSize(file), file.Split('\\')[file.Split('\\').Length - 1]);

return new data("$null");

}

else if (arg[2].ToUpper() == "/A:R")

{

List files = new List();

files.AddRange(Directory.GetDirectories(arg[1]).ToList());

files.AddRange(Directory.GetFiles(arg[1]).ToList());

foreach (string file in files)

{

if (new FileInfo (file).IsReadOnly)

Console.WriteLine("{0} {1} {2} {3}", File.GetCreationTime(file).ToString(), IsDir(file), getSize(file), file.Split('\\')[file.Split('\\').Length - 1]);

}

return new data("$null");

}

}

if (com == "CLS")

{

Console.Clear();

return new data("$null");

}

if (com == "LOG")

{

return new data(File.ReadAllText("log.txt"));

}

if (com == "LOGCLS")

{

File.WriteAllText("log.txt", "");

return new data("$null");

}

return new data("Данной команды не существует, или произошла ошибка. Используйте help для справки");

}

catch (Exception ee) { File.AppendAllText("log.txt", ee.Message + "\n" + ee.InnerException + "\n" + ee.Source + "\n" + ee.StackTrace + "\n" + ee.TargetSite + "\n"); return new data("Данной команды не существуе. Используйте help для справки"); }

}

protected string IsDir(string path)

{

if (Directory.Exists(path))

return "";

return " ";

}

protected string getSize(string path)

{

if (File.Exists(path))

return trimIt(new FileInfo(path).Length.ToString());

return " ";

}

protected static string trimIt(string s)

{

if (s == null)

return string.Empty;
int count = Math.Min(s.Length, 5);

s = s.Substring(0, count);

for (int p = s.Length; p < 5; p ++) {

s += " ";

}

return s;

}

}

class data {

public string msg;

public string date;
public data (string m) {

msg = m;

DateTime thisDay = DateTime.Today;

date = thisDay.ToString();

}

}

}

5. Тестовые задания для проверки работы КП


Список тестовых заданий.

1. Проверить работу команды cd c:

2. Проверить работу команды cd dir

3. Проверить команду cd ..

4. Проверить команду cd /?

5. Проверить работу команды DIR без ключей.

6. Проверить работу команды DIR с ключом /A:R

7. Проверить работу команды DIR с ключом /O:N

8. Проверить работу команды DIR /?

9. Проверить работу команды DATE.

10. Проверить работу команды DATE /?

11. Проверить работу команды ATTRIB file.txt без ключей.

12. Проверить работу команды ATTRIB file.txt +R

13. Проверить работу команды ATTRIB file.txt -R

14. Проверить работу команды ATTRIB /?

6. Скриншоты выполнения команд реализованного КП




1. Проверить работу команды cd c:



2. Проверить работу команды cd dir



3. Проверить команду cd ..



4. Проверить команду cd /?



5. Проверить работу команды DIR без ключей.



6. Проверить работу команды DIR с ключом /A:R



7. Проверить работу команды DIR с ключом /O:N



8. Проверить работу команды DIR /?



9. Проверить работу команды DATE.



10. Проверить работу команды DATE /?



11. Проверить работу команды ATTRIB file.txt без ключей.



12. Проверить работу команды ATTRIB file.txt +R



13. Проверить работу команды ATTRIB file.txt -R



14. Проверить работу команды ATTRIB /?


7. Список использованной литературы


  1. Агуров П. В. C#. Разработка компонентов в MC Visual studio 2005/2008 / Агуров П. В. – СПб.:БХВ-Петербург, 2008. – 479 с.

  2. Биллиг В. А. Основы объектного программирования на C# (C# 3.0, Visual Studio 2008) [Текст]: учебное пособие / В. А. Биллиг. — Москва: Интернет-университет информационных технологий, Бином. Лаборатория знаний, 2016. — 584 c.

  3. Гагарина Л.Г. Технология разработки программного обеспечения: учебное пособие / Л.Г. Гагарина, Е.В. Кокорева, Б.Д. Виснадул. – М.: ИД «ФОРУМ»: ИНФРА-М, 2009.

  4. Кариев Ч.А. Разработка Windows-приложений на основе Visual C# [Электронный ресурс] : учебное пособие / Ч.А. Кариев. — Электрон. текстовые данные. — Москва, Саратов: Интернет-Университет Информационных Технологий (ИНТУИТ), Вузовское образование, 2017. — 768 c.

  5. Олифер В.Г. Сетевые операционные системы [Текст] : учебное пособие для вузов / В. Г. Олифер, Н. А. Олифер. — СПб.: Питер, 2007. — 538 с.

  6. Подбельский В. В. Язык C#. Базовый курс [Текст]: учебное пособие / В. В. Подбельский — 2-е изд. — Москва: Финансы и статистика, 2013. — 408 с.

  7. Руководство по программированию в Windows Forms [Электронный ресурс]. — Режим доступа: https://metanit.com/sharp/windowsforms/ (дата обращения: 20.08.2022)

  8. Microsoft Corporation. Принципы проектирования и разработки программного обеспечения. Учеб. курс MCSD. М.: Изд.-торг. дом «Русская редакция», 2000.

  9. Windows Forms. Программирование на C# [Электронный ресурс]. — Режим доступа: http://csharpcoding.org/category/windows-forms/ (дата обращения: 15.03.2017).