КУРСОВОЙ ПРОЕКТ
Содержание Введение
1. Описание файловой системы OC Unix
2. Постановка задачи
3. Описание полученных для реализации команд и сравнение с родственными командами ОС Windows
4. Выбор средств реализации
5. Разработка программного продукта
Заключение
Список литературы
Приложение
Введение UNIX - группа переносимых, многозадачных и многопользовательских операционных систем. Первая система UNIX была разработана в 1969 г. в подразделении Bell Labs компании AT&T. С тех пор было создано большое количество различных UNIX-систем.
Некоторые отличительные признаки UNIX-систем включают в себя:
использование простых текстовых файлов для настройки и управления системой;
широкое применение утилит, запускаемых в командной строке;
взаимодействие с пользователем посредством виртуального устройства - терминала;
представление физических и виртуальных устройств и некоторых средств межпроцессового взаимодействия как файлов;
использование конвейеров из нескольких программ, каждая из которых выполняет одну задачу.
В настоящее время UNIX используются в основном на серверах, а также как встроенные системы для различного оборудования. На рынке ОС для рабочих станций и домашнего применения UNIX уступили другим операционным системам, таким как Microsoft Windows и Mac OS, хотя существующие программные решения для Unix-систем позволяют реализовать полноценные рабочие станции как для офисного, так и для домашнего использования.
UNIX-системы имеют большую историческую важность, поскольку благодаря им распространились некоторые популярные сегодня концепции и подходы в области ОС и программного обеспечения. Также, в ходе разработки Unix-систем был создан язык Си.
1. Описание файловой системы OC Unix Понятие файла является одним из наиболее важных для ОС UNIX. Все файлы, с которыми могут манипулировать пользователи, располагаются в файловой системе, представляющей собой дерево, промежуточные вершины которого соответствуют каталогам, и листья - файлам и пустым каталогам. Примерная структура файловой системы ОС UNIX показана на рисунке 1. Реально на каждом логическом диске (разделе физического дискового пакета) располагается отдельная иерархия каталогов и файлов. Для получения общего дерева в динамике используется "монтирование" отдельных иерархий к фиксированной корневой файловой системе.
Каждый каталог и файл файловой системы имеет уникальное полное имя (в ОС UNIX это имя принято называть full pathname - имя, задающее полный путь, поскольку оно действительно задает полный путь от корня файловой системы через цепочку каталогов к соответствующему каталогу или файлу; я буду использовать термин "полное имя", поскольку для pathname отсутствует благозвучный русский аналог). Каталог, являющийся корнем файловой системы (корневой каталог), в любой файловой системе имеет предопределенное имя "/" (слэш). Полное имя файла, например, /bin/sh означает, что в корневом каталоге должно содержаться имя каталога bin, а в каталоге bin должно содержаться имя файла sh. Коротким или относительным именем файла (relative pathname) называется имя (возможно, составное), задающее путь к файлу от текущего рабочего каталога (существует команда и соответствующий системный вызов, позволяющие установить текущий рабочий каталог). В каждом каталоге содержатся два специальных имени, имя ".", именующее сам этот каталог, и имя "..", именующее "родительский" каталог данного каталога, т.е. каталог, непосредственно предшествующий данному в иерархии каталогов.
Рисунок 1- Структура каталогов файловой системы
поддерживает многочисленные утилиты, позволяющие работать с файловой системой и доступные как команды командного интерпретатора. Вот некоторые из них (наиболее употребительные):
cp имя1 имя2 - копирование файла имя1 в файл имя2
rm имя1 - удаление файла имя1
mv имя1 имя2 - переименование файла имя1 в файл имя2имя - создание нового каталога имяимя - уничтожение каталога имяимя - выдача содержимого каталога имяимя - выдача на экран содержимого файла имяимя режим - изменение режима доступа к файлу
Файловая система обычно размещается на дисках или других устройствах внешней памяти, имеющих блочную структуру. Кроме блоков, сохраняющих каталоги и файлы, во внешней памяти поддерживается еще несколько служебных областей.
В мире UNIX существует несколько разных видов файловых систем со своей структурой внешней памяти. Наиболее известны традиционная файловая система UNIX System V (s5) и файловая система семейства UNIX BSD (ufs). Файловая система s5 состоит из четырех секций (рисунок 2 (a)). В файловой системе ufs на логическом диске (разделе реального диска) находится последовательность секций файловой системы (рисунок 2 (b)).
Рисунок 2 - Структура внешней памяти файловых систем s5 и ufs. Кратко опишем суть и назначение каждой области диска.
· Boot-блок содержит программу раскрутки, которая служит для первоначального запуска ОС UNIX. В файловых системах s5 реально используется boot-блок только корневой файловой системы. В дополнительных файловых системах эта область присутствует, но не используется.
· Суперблок - это наиболее ответственная область файловой системы, содержащая информацию, которая необходима для работы с файловой системой в целом. Суперблок содержит список свободных блоков и свободные i-узлы (information nodes - информационные узлы). В файловых системах ufs для повышения устойчивости поддерживается несколько копий суперблока (как видно из рисунка 2.2,b, по одной копии на группу цилиндров). Каждая копия суперблока имеет размер 8196 байт, и только одна копия суперблока используется при монтировании файловой системы (см. ниже). Однако, если при монтировании устанавливается, что первичная копия суперблока повреждена или не удовлетворяет критериям целостности информации, используется резервная копия.
· Блок группы цилиндров содержит число i-узлов, специфицированных в списке i-узлов для данной группы цилиндров, и число блоков данных, которые связаны с этими i-узлами. Размер блока группы цилиндров зависит от размера файловой системы. Для повышения эффективности файловая система ufs старается размещать i-узлы и блоки данных в одной и той же группе цилиндров.
· Список i-узлов (ilist) содержит список i-узлов, соответствующих файлам данной файловой системы. Максимальное число файлов, которые могут быть созданы в файловой системе, определяется числом доступных i-узлов. В i-узле хранится информация, описывающая файл: режимы доступа к файлу, время создания и последней модификации, идентификатор пользователя и идентификатор группы создателя файла, описание блочной структуры файла и т.д.
· Блоки данных - в этой части файловой системы хранятся реальные данные файлов. В случае файловой системы ufs все блоки данных одного файла пытаются разместить в одной группе цилиндров. Размер блока данных определяется при форматировании файловой системы командой mkfs и может быть установлен в 512, 1024, 2048, 4096 или 8192 байтов.
2. Постановка задачи
Необходимо разработать программный продукт, работающий в среде Windows и представляющий собой эмулятор командного процессора ОС Unix. То есть после запуска программы под управлением ОС Windows на экране должна появиться командная строка, которая внешне выглядит и функционирует как командная оболочка ОС Unix. После набора некоторых команд ОС Unix, они должны отрабатывать так же, как выполняются в ОС Unix. Список команд, которые необходимо реализовать выдается преподавателем и состоит из 7 команд. Кроме того, всем необходимо реализовать команду man (помощь по командам), для всех команд реализовать возможность использования перенаправления ввода-вывода (< >), и использования метасимволов (*, ?). Например: ls *.sh > 1.txt
Выбор языка программирования для написания программы остается за студентом. Использовать при реализации программного продукта команды DOS/Windows для реализации команд (cmp, diff, ls, comm, sort, rm) не допускается, то есть реализовывать данные команды необходимо с помощью средств языка программирования.
Прежде чем приступить к написанию программы необходимо изучить, как работают команды в ОС Linux. Для каждой команды реализовать несколько ключей, по выбору преподавателя. Изучение команд предусмотрено в лабораторной работе № 1.
Список команд, необходимых для реализации:
ls, cat, mv, cmp, comm, wc, cd, man. 3. Описание полученных для реализации команд и сравнение с родственными командами ОС Windows · LS
ls каталог параметры
Вывод списка файлов в каталоге. Если каталог не указан, использовать текущий каталог.
- вывод информации о каждом файле или каталоге с новой строки,
a - вывод информации о всех файлах и каталогах,
c - сортировать содержимое каталога в соответствии с временем изменения состояния файла,
l - расширенная информация о файлах,
p -вывод наклонной черты в конце имени каталога.
· СMP
cmp файл_1 файл_2 параметры
Побайтное сравнение двух файлов
l - Вывести номер байта для каждого несовпадения.
· COMM
сomm файл_1 файл_2 параметры
Построчное сравнение содержимого 2-х текстовых файлов. Вывод производится в три столбца: строки, содержащиеся в первом файле; строки, содержащиеся во втором файле, строки, содержащиеся в обоих файлах.
- запрет вывода 1-ого столбца,
- запрет вывода 2-ого столбца,
- запрет вывода 3-его столбца,
- вывод только 3-его столбца,
- вывод только 2-ого столбца,
- вывод только 1-ого столбца.
· CAT
сat параметры файла(ы)
Вывод содержимого файлов.
s - запрет вывода дублирующихся пустых строк.
· CD
cd каталог
Эта команда используется для смены каталог. Если вы введете эту команду без аргументов, вы попадете в свой домашний каталог; чтобы попасть в любой другой каталог, необходимо указать путь (pathname) к нему.
· WCфайл параметры
С помощью команды wc вы можете подсчитать число строк, слов и символов в указанном файле. Вы можете с помощью ключей указать либо подсчет только строк, или только слов, или символов.
l - вывести количество строк
c - вывести количество слов
-w - вывести количество слов
· CATфайл_1 файл_2 > файл_3
Команда, выводящая последовательно указанные файлы, таким образом, объединяя их в единый поток.
· MV
mv файл_1 целевой_файл
Команда mv перемещает (переименовывает) файл_1 в целевой_файл.
i - выводить запрос на подтверждение операции, когда существует файл, в который происходит перемещение.
Ниже приведена таблица сравнения команд OC Linux и Windows. Сравнение команд ОС Linux и Windows. Аналог в Windows
| Команда Linux
| CD
| cd
| DIR
| dir, ls
| FC, COMP
| cmp, diff, diff3, sdiff
| MORE, TYPE
| cat, less, more, xmore
| MOVE
| mv (перемещение)
| REN, RENAME, MOVE
| mv (переименование)
|
* Аналог в Windows - подразумевается cmd.exe (интерпретатор командной строки Windows).
Если посмотреть внимательно, то можно заметить, что многие команды в Linux носят такое же имя, как и в MS DOS. Это следствие того, что у обеих операционных систем был общий предок - операционная система UNIX, да и в дальнейшем влияние на Linux оказывали новые идеи, применяемые в MS DOS/Windows.
4. Выбор средств реализации
В настоящее время существует большой выбор средств разработки приложений на платформе операционной системы Windows. Но мой выбор пал на Microsoft Visual Studio C++.
Microsoft Visual Studio - это отличная среда разработки приложений под ОС Windows. Microsoft Visual Studio предоставляет пользователю, при создании проекта большое количество различных типов проектов, что безусловно путает даже бывалого программиста, не то что начинающего. Но большое количество типов проектов дает хорошее представление о возможностях данного инструмента. MVS - это действительно высококлассная IDE, которой пользуются большинство профессионалов для разработки приложений под ОС Windows.
Для программирования под Windows, нет ничего лучше, чем Visual Studio - это достаточно мощная IDE. Её редактор подсвечивает синтаксис и выполняет форматирование кода, что в свою очередь в разы делает код читабельнее. Более того, редактор MVS автоматически завершает некоторые структуры кода, нам стоит начать печатать, например, оператор выбора switch, редактор сам его завершит.
Итак, MVS - это мощный инструмент разработки по под ОС Windows, он идеально подходит для разработки больших проектов. Но для начинающего программиста эта IDE не будет достаточно эффективной. Во время компиляции даже небольших проектов, приходится ждать довольно продолжительное время, что отрицательно сказывается на производительности программиста. Поэтому, если вы ещё совсем новичок поработайте с другими IDE, бессмысленно устанавливать "этого гиганта" для написания простых программок.
Интегрированная поддержка разработки через тестирование и новые инструменты отладки позволяют быстро и без труда находить и устранять ошибки, обеспечивая высокое качество решений.
В ходе реализации, мне понадобилось подключение следующих библиотек и заголовочных файлов:
· iostream - объектно-ориентированная иерархия классов, где используется и множественное, и виртуальное наследование. В ней реализована поддержка для файлового ввода/вывода данных встроенных типов. Кроме того, разработчики классов могут расширять эту библиотеку для чтения и записи новых типов данных.
Операции ввода/вывода выполняются с помощью классов istream (потоковый ввод) и ostream (потоковый вывод). Третий класс, iostream, является производным от них и поддерживает двунаправленный ввод/вывод. Для удобства в библиотеке определены три стандартных объекта-потока:- объект класса istream, соответствующий стандартному вводу. В общем случае он позволяет читать данные с терминала пользователя;- объект класса ostream, соответствующий стандартному выводу. В общем случае он позволяет выводить данные на терминал пользователя;- объект класса ostream, соответствующий стандартному выводу для ошибок. В этот поток мы направляем сообщения об ошибках программы.
Вывод осуществляется, как правило, с помощью перегруженного оператора сдвига влево (<<), а ввод - с помощью оператора сдвига вправо (>>):
· string - заголовочный файл с классами, функциями и переменными для организации работы со строками.
· locale - заголовочный файл стандартной библиотеки языка программирования С, который используется для задач, связанных с локализацией. Для поддержки русского языка.
· iomanip - библиотекареализует инструменты для работы с форматированием вывода.
· fstream - библиотека, предназначенная для работы с файлами.
· Windows.h - заголовочный файл, в котором хранятся структуры, необходимые для работы с данными файла.
· vector - заголовочный файл для работы с вектором.
· sstream - заголовочный файл с классами, функциями и переменными для организации работы со строками типа sstream.
· lmcons.h - заголовочный файл с функцией для определения имени пользователя в учетной записи windows.
· conio.h - этот заголовочный файл объявляет несколько библиотечных функций для работы с "консольным вводом и выводом" программы (функция getch() ).
В основе реализации команды ls, лежит функция FindFirstFile и структура WIN32_FIND_DATA.
Функция FindFirstFile ищет в директории файл или поддиректорию с именем, которое соответствует указанному имени. Возвращаемые значения:
Если функция успешна, возвращается дескриптор поиска, используемый в последующих вызовах FindNextFile или FindClose.
При ошибке возвращается INVALID_HANDLE_VALUE.
Функция FindFirstFile открывает десриптор поиска и возвращает информацию о первом файле, с именем, которое отвечает заданным условиям. Следующий список описывает некоторые особенности поиска:
· Поиск производится только по имени файла, а не по любым его атрибутам, таким как время и тип файла.
· Поиск допускает длинные и короткие имена файла.
· После получения дескриптора поиска, используют функцию FindNextFile для поиска остальных файлов, отвечающих тем же условиям.
· Когда дескриптор поиска больше не нужен, он закрывается с помощью функции FindClose.
Для того, чтобы просмотреть файлы или получить атрибуты файловой директории, делайте следующее:
· Для просмотра файлов в корневой директории можно воспользоваться "C:\*" и пожашным переходом по директориям используя FindNextFile.
· Для получения атрибутов корневой директории, нужно воспользоваться сяGetFileAttributes.
Структура WIN32_FIND_DATA описывает файл, найденный функцией FindFirstFile, FindFirstFileEx или FindNextFile. Синтаксис данной структуры таков:struct _WIN32_FIND_DATA {dwFileAttributes;ftCreationTime;ftLastAccessTime;ftLastWriteTime;nFileSizeHigh;nFileSizeLow;dwReserved0;dwReserved1;cFileName[ MAX_PATH ];cAlternateFileName[ 14 ];
} WIN32_FIND_DATA, *PWIN32_FIND_DATA;
Используемые члены структуры:
§ dwFileAttributes
Атрибуты искомого файла. Этот член структуры может состоять из одного или нескольких нижеследующих значений.
Атрибуты и их предназначение. Атрибут
| Предназначение
| FILE_ATTRIBUTE_ARCHIVE
| Файл или каталог - архивные.
| FILE_ATTRIBUTE_DIRECTORY
| Дескриптор идентифицирует каталог.
| FILE_ATTRIBUTE_HIDDEN
| Файл или каталог скрытые.
| FILE_ATTRIBUTE_READONLY
| Файл или каталог только для чтения.
| FILE_ATTRIBUTE_SYSTEM
| Файл или каталог системные.
|
§ ftLastWriteTime
Структура FILETIME. Для файла, структура устанавливает, когда последний раз была запись в файл, он обрезался или переписывался (например функциями WriteFile или SetEndOfFile). Эта дата и время не обновляются тогда, когда атрибуты файла или дескрипторы безопасности изменяются. Для каталога, структура определяет, когда каталог создавался. Если лежащая в основе файловая система не поддерживает последнее время записи, этот член структуры равняется нулю.
§ nFileSizeHigh
Старшее двойное слово (DWORD) значения размера файла, в байтах. Это значение равняется нулю, если размер файла не больше, чем определяет его MAXDWORD.
§ nFileSizeLow
Младшее двойное слово (DWORD) значения размера файла, в байтах.
§ cFileName
Символьная строка с нулем в конце, которая устанавливает имя файла.
Для того, чтобы копировать, перемещать, переименовывать или удалять файлы в среде Windows на языке C++ существует функция SHFileOperation, но для ее реализации, нужна структура SHFILEOPSTRUCT, которая имеет следующий синтаксис: typedef struct _SHFILEOPSTRUCT {
HWND hwnd;wFunc;pFrom;pTo;_FLAGS fFlags;fAnyOperationsAborted;hNameMappings;lpszProgressTitle;
} SHFILEOPSTRUCT, *LPSHFILEOPSTRUCT;
5. Разработка программного продукта
Прежде всего, стоит начать с того, что программный продукт разрабатывался как консольное приложение, то есть без графических элементов.
Мое приложение состоит из 8 функций (включая главную - int_main) и 1 класс. Функции следующие:
· enum ConsoleColor и void SetColor - отвечают за изменение текста в консоли . Функция ConsoleColor служит для удобной смены цвета, а SetColor устанавливает цвет, благодаря SetConsoleTextAttribute().
· DWORDLONG gfs - эта функция, определяет размер файла или папки, используя структуру WIN32_FIND_DATA и функцию FindFirstData(), путем сложения (nFileSizeHigh * (MAXDWORD+1)) + nFileSizeLow.
· void MoveFolder - данная функция перемещает файлы, либо переименовывает их. Она использует структуру SHFILEOPSTRUCT и функцию SHFileOperation, в которую она передает в параметр wFunc - FO_MOVE (переместить/переименовать объект), в pFrom - путь до объекта, в pTo - путь, в который следует переместить/переименовать объект.
· bool DirExists - следующая функция возвращает логическую единицу, если указанная директория или файл существуют.
· wchar_t* un - функция, которая возвращает имя пользователя компьютера. В ее основе лежит функция GetUserName();
· bool IfFileExistsAndIsNotEmpty - как видно по названию, функция определяет пуст ли файл. В ее основе лежит функция GetFileAttributesW().
Класс outclass был создан с целью организовать вывод команд в файл. Данный
класс имеет 2 метода: startout(string filname) и endout(). Первый метод отвечает за создание файла, и перенаправление вывода в него. Также стоит отметить, что в качестве аргумента передается название файла. Второй метод служит для прекращения вывода в файл, и восстановления вывода на экран.
При первом запуске, изменяется цвет консоли, и изменяется кодировка для поддержки и правильного отображения кириллицы(используя chcp). Потом с помощью функции SetCurrentDirectory(), в программе устанавливается домашняя директория. После, инициализируется объект класса outclass и вектор строк (типа string), в который будет заноситься каждое слово, что введется в качестве команды в терминал.
Все меню программы основано на бесконечном цикле while, условие выхода из которого следующее: если пользователь введет exit, то мы выйдем из цикла и следовательно программа завершится, в других же случаях либо запустится нужный нам участок кода (ls, cd, cat, comm, и т.д.), если первый элемент вектора строк совпадет с названием команды, либо выдаст сообщение об ошибке, в котором будет сказано, что данной программы не существует. В начале цикла выводится строка, в которой обозначен путь текущей директории и имя пользователя системы, как в системе OC Linux. Именно сюда, нам и предлагается ввести команду. После выполнения того или иного участка кода, который отвечает за команду, выполняется оператор continue, что перебрасывает нас в самое начало цикла.
Заключение
unix программный эмулятор windows
В результате выполнения курсовой работы была изучена файловая система ОС Unix, ее структура и работа основных команд, к которым относятся ls, cmp, comm, а также их ключей. Кроме того изучена работа аналогов этих команд в среде Windows. Затем разработан эмулятор работы командного процессора ОС Unix в среде ОС Windows. Он включал в себя следующие команды:
- ls вывод списка файлов.
- Cmp побайтное сравнение двух файлов
- Comm сравнение строк в файлах.
- Cat вывод или конкатенация файлов.
- Cd установление директории.
- Wc подсчет количества строк, слов и символов в файле.
- Mv переименование или перемещение файлов.
- Man справочное руководство.
В качестве средства реализации выбран язык c++, в среде MS Visual Studio, так как его возможности идеально подходят в качестве решения.
Список литературы 1. Николенко Д. В. Самоучитель по Visual C++. -СПб : Наука и техника, 2001. -368 с.
. Уэйт М. , Прата С. , Мартин Д. Язык Си. Руководство для начинающих. - М. : Мир, 1988. -512с.
. Савич У. С++ во всей полноте. - К. : BHV; СПб: Питер, 2005. 784 с.
Приложение
#include "stdafx.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include namespace std;* buffer=new char[MAX_PATH];outclass
{:*x; ofstream f;:startout(string filename)
{f.open(filename); x = cout.rdbuf( f.rdbuf()); }endout(){ cout.rdbuf(x); }
};ConsoleColor
{= 0, Blue = 1, Green = 2, Cyan = 3, Red = 4, Magenta = 5,= 6, LightGray = 7, DarkGray = 8, LightBlue = 9, LightGreen = 10,LightCyan = 11, LightRed = 12 LightMagenta = 13, Yellow = 14, White = 15
};SetColor(ConsoleColor text, ConsoleColor background)
{ HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);(hStdOut, (WORD)((background << 4) | text));
}gfs(wchar_t* ta)
{_t* u = ta;Handle;_FIND_DATA FindData;Result=0;= FindFirstFile(u, &FindData);(Handle == INVALID_HANDLE_VALUE){ return 0;}
{(wcscmp(FindData.cFileName,L".") != 0 && wcscmp(FindData.cFileName,L"..") != 0)(FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
}= Result + ((DWORDLONG)FindData.nFileSizeHigh<<32) + FindData.nFileSizeLow;
}while(FindNextFile(Handle, &FindData) != 0);(Handle);Result;
}MoveFolder(LPCTSTR pszFrom, LPCTSTR pszTo)
{fos = {0};.wFunc = FO_MOVE;.pFrom = pszFrom;.pTo = pszTo;
::SHFileOperation(&fos);
}DirExists( const wchar_t *fname )
{( fname == NULL || wcslen(fname) == 0 )
{false;
}dwAttrs = ::GetFileAttributesW( fname );( dwAttrs == DWORD(-1) )
{dLastError = GetLastError();( ERROR_TOO_MANY_NAMES == dLastError
|| ERROR_SHARING_VIOLATION == dLastError
|| ERROR_TOO_MANY_SESS == dLastError
|| ERROR_SHARING_BUFFER_EXCEEDED == dLastError )
{true;
}else
{false;
}
}true;
}_t* un()
{_t name[600];sz=sizeof(name);(name,&sz);name;
}IfFileExistsAndIsNotEmpty( string fPath )
{str[255];file_re; file_re.open( fPath.c_str() );( ! file_re ) { return false; }( ! file_re.getline( str, sizeof(str) ).eof() ) { return true; }false;
}_tmain(int argc, _TCHAR* argv[])
{( "color 0A" ); setlocale(LC_ALL, "Russian");("chcp 1251"); system("cls");(L"c:\\vlad");_FIND_DATA FindFileData; HANDLE hf; SYSTEMTIME st;path;s2;_t t[100]={0};was=false; vs;(1)
{.clear();=false;(MAX_PATH,buffer);(buffer, buffer);bufcom[256];sizecom = 256;(bufcom,&sizecom);out_file;<$ ";(cin,path);(path.empty()) { continue;}ss;.str(path);(ss>>s2) vs.push_back(s2);(path=="exit") {return 0;}(vs[0]=="cat")
{= true;(vs.size()==1) { cout<<"cat: не хватает операнда"< { if(vs[i]=="-s") {skey=true; vs.erase(vs.begin() + i);}}(int i=0; i {(vs[i]==">")
{.erase(vs.begin() + i);(i>=vs.size()) {cout<<"bash:syntax error near unexpected token 'newline'"< }
}(err==true) continue;(cnc==true)
{(int i=0;i {s(vs[i]);(!s) { cerr<<"cat: "< {(getline(s, text))
{(text.empty() && text == emp ) continue;< }
}
{(getline(s, text))
{ o<< text << endl; }
}
};
}(int i=0;i {s(vs[i]);(!s) { cerr<<"cat: "< {(getline(s, text))
{(text.empty() && text == emp ) continue;< }
}
{(getline(s, text))
{ cout << text << endl; }
}
};
}(vs[0]=="cd" )
{= true; wchar_t* cd = new wchar_t[MAX_PATH];(vs.size()==1) { SetCurrentDirectory(L"c:\\vlad\\"); continue; }.erase(vs.begin());= vs[0];(cd,path.c_str(),MAX_PATH);(SetCurrentDirectory(cd)==0)
{cout<<"Unknown file or directory!"<0)
{(int i=0; i {<<"cd: неизвестный операнд или ключ '"< };
}(cd);;
}(vs[0]=="man" )
{=true;c; bool ex = false; string text; string file="";found=false;
if(vs.size()==1)
{string stranica; cout<<"Какая страница руководства вам нужна?"< {=true; ifstream f("c:\\vlad\\"+vs[0]);(White,Black); system("cls");(getline(f, text)) cout< {= getch();(c==113) break;
}("cls"); SetColor(LightGreen,Black);
}(ex==false)
{error_nabor="";(int i=0; i { error_nabor= error_nabor + " " + vs[i];}
cout<<"Руководство по "< continue;
};
}(vs[0]=="ls" )
{=true;.erase(vs.begin());mone = false; bool akey = false; bool lkey = false; bool ckey = false; bool pkey = false;out =false;bool err= false;o;polz[600];file;(polz,un(),600);(int i=0; i { if(vs[i]=="-1") {mone=true; vs.erase(vs.begin() + i);}}(int i=0; i { if(vs[i]=="-a") {akey=true; vs.erase(vs.begin() + i);}}(int i=0; i { if(vs[i]=="-l") {lkey=true; vs.erase(vs.begin() + i);} }(int i=0; i { if(vs[i]=="-c") {ckey=true; vs.erase(vs.begin() + i);}}(int i=0; i { if(vs[i]=="-p") {pkey=true; vs.erase(vs.begin() + i);} }(int i=0; i {(vs[i]==">")
{=true;.erase(vs.begin() + i);(i>=vs.size())
{ cout<<"bash:syntax error near unexpected token 'newline'"< { file = vs[i].c_str(); vs.erase(vs.begin() + i); o.open(file); o.close();o.open(file,std::ios::app);}
}
}(vs.size()==0)
{strcat(buffer,"\\*"); mbstowcs(t, buffer, 100); }
{vs[0].push_back('*'); mbstowcs(t, vs[0].c_str(), 100); vs.erase(vs.begin());}(vs.size()>0)
{(int i=0; i {<<"ls: неизвестный операнд или ключ '"< };
}=FindFirstFile(t, &FindFileData);(hf==INVALID_HANDLE_VALUE)
{ wcout< if (hf!=INVALID_HANDLE_VALUE)
{(out!=true)< {(akey==false && (wcscmp(FindFileData.cFileName, L".")!=1 || wcscmp (FindFileData.cFileName, L"..") !=1))
{;
}(!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) //если файл
{(lkey==true)
{(out==true)
{(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE)<< L"arch ";(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)< {<< st.wDay << "-" << st.wMonth << "-"
<< st.wYear << " " << st.wHour << ":"
<< st.wMinute << ":" << st.wSecond << " ";
}<
}
{(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE)<< "arch ";(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)<<"hidden ";(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)<<"system ";(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)<<"readonly ";(&FindFileData.ftLastWriteTime, &FindFileData.ftLastWriteTime);(FileTimeToSystemTime(&FindFileData.ftLastWriteTime, &st) == TRUE)
{< }< }
}
{(out==true)
{< {< }
}
{< }
}
}
{(LightGray,Black);(lkey==true)
{(out==true)
{(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE)<< "arch ";(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)<< "hidden ";(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)<< "system ";(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)<< "readonly ";(&FindFileData.ftLastWriteTime, &FindFileData.ftLastWriteTime);(FileTimeToSystemTime(&FindFileData.ftLastWriteTime, &st) == TRUE)
{<< st.wDay << "-" << st.wMonth << "-"
<< st.wYear << " " << st.wHour << ":"
<< st.wMinute << ":" << st.wSecond << " ";
}_t tmp[100];(tmp,wcstok(t,L"*"));(tmp,FindFileData.cFileName); wcscat(tmp,L"\\*");<
}
{(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE)<< "arch ";(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)<< "hidden ";(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)<< "system ";(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)<< "readonly ";(&FindFileData.ftLastWriteTime, &FindFileData.ftLastWriteTime);(FileTimeToSystemTime(&FindFileData.ftLastWriteTime, &st) == TRUE)
{<< st.wDay << "-" << st.wMonth << "-"
<< st.wYear << " " << st.wHour << ":"
<< st.wMinute << ":" << st.wSecond << " ";
}_t tmp[100];(tmp,wcstok(t,L"*"));(tmp,FindFileData.cFileName); wcscat(tmp,L"\\*");< }
}(out==true)
{(pkey==true) {o< {< }(LightGreen,Black);
}
{(pkey==true) {wcout< {< }(LightGreen,Black);
}
}
}(FindNextFile(hf,&FindFileData)!=0);(hf);(!out==true) cout< }
}(vs[0]=="mv" )
{=true;(vs.size()==1) {cout<<"mv: пропущен операнд, задающий файл"< {(vs[i]=="-i") {ikey=true; vs.erase(vs.begin() + i);}
}= vs[0]; to = vs[1];(vs.size()>2)
{(int i=2; i {<<"mv: неизвестный операнд или ключ '"< };
}katalg;_t nalfile[100]={0};(nalfile, fr.c_str(), 100);(!DirExists(nalfile)){ cout<<"mv: файл "< {(to [i] == '\\' )
{=i; kat=true;
}
}(kat==true)
{katalg=to.substr(0,n);}(p2, katalg.c_str(), 100);(!DirExists(p2)){cout<<"mv: '"< {fnd=false; bool slash=false;(int i=0; i {(fr [i] == '\\' )
{=i;=true;
}
}(fnd==true) { ik1=fr.substr(n,fr.length()-n); }{ ik1=fr;}(to[to.length()-1] == '\\' ) { slash=true;}{slash=false;}(slash==true) {ik2=to+ik1;}{ ik2=to; }_t wi1[100]={0}; wchar_t wi2[100]={0};(wi1, ik2.c_str(), 100); mbstowcs(wi2, to.c_str(), 100);(!DirExists(wi2))
{
}(DirExists(wi1))
{< string f;(cin,f);(f=="n")
{ continue; }(f=="y")
{ }
{ cout<<"bash: ответ неверен!"< }
}_t wmv[100]={0}; wchar_t wmv2[100]={0};(wmv, fr.c_str(), 100); mbstowcs(wmv2, to.c_str(), 100);(wmv, wmv2);
}(vs[0]=="cmp" )
{=true;(vs.size()==1){ cout<<"cmp: пропущен первый операнд, задающий файл начальный файл"< { cout<<"cmp: после '"< {if(vs[i]=="-l") {lkey=true; vs.erase(vs.begin() + i);}}counter = 0; int counter2 = 1;f1(vs[0]);(!f1) { cerr<<"cmp: "< {(vs[i]==">")
{.erase(vs.begin() + i);(i>=vs.size()) {cout<<"bash:syntax error near unexpected token 'newline'"< }
}(err==true);(vs.size()>2)
{(int i=2; i {<<"cmp: неизвестный операнд или ключ '"< };
}(!IfFileExistsAndIsNotEmpty(vs[0]) && !IfFileExistsAndIsNotEmpty(vs[1]) )
{ cout<<"Files are identical."< { cout<<"cmp: конец файла в "< { cout<<"cmp: конец файла в "< {
while (f1.get(ch1) && f2.get(ch2) )
{++;(ch1 != ch2)
{=true;< }
}
}(f1.get(ch1) && f2.get(ch2) )
{(ch1 == '\n') counter2++;++;(ch1 != ch2)
{=true; cout<<"differ: byte "< }
}(dif==false) { cout<<"Files are identical."< }(vs[0]=="wc" )
{(vs.size()<2)
{<<"wc: не хватает операнда"< }=true;.erase(vs.begin());lkey=false; bool wkey=false; bool ckey=false;w = 0; int l = 1; int c = 0;(int i=0; i {(vs[i]=="-l") {lkey=true; vs.erase(vs.begin() + i);}
}(int i=0; i {(vs[i]=="-w") {wkey=true; vs.erase(vs.begin() + i);}
}(int i=0; i {(vs[i]=="-c") {ckey=true; vs.erase(vs.begin() + i);}
}err=false; bool out=false;file;(int i=0; i {(vs[i]==">")
{.erase(vs.begin() + i);(i>=vs.size())
{ cout<<"bash:syntax error near unexpected token 'newline'"< { out=true; file = vs[i].c_str(); vs.erase(vs.begin() + i);}
}
}(int i=0; i {f1(vs[i]); if (!f1) { cerr<<"wc: "< }(err==true) continue;(int i = 0; i {ch1; word;tmp;f2(vs[i]);(f2>>tmp).push_back(tmp);f1(vs[i]);(f1.get(ch1))
{++;(ch1 == '\n')
{++;
}
}=w+word.size();(i!=0)++;
}(l==1 && c==0) l=0;(out==true) out_file.startout(file);((lkey==false && wkey==false && ckey ==false) || (lkey==true && wkey==true && ckey ==true))
{cout< }(vs[0]=="comm" )
{=true;.erase(vs.begin());emp1 = false; bool emp2 =false; bool one=false; bool two=false; bool three=false; bool ontw=false; bool onth=false; bool twth=false; bool pre=false; bool out=false;(int i=0; i c1; vector c2;f1(vs[0]); if (!f1) { cerr<<"comm: "< {(vs[i]==">")
{.erase(vs.begin() + i);(i>=vs.size())
{ cout<<"bash:syntax error near unexpected token 'newline'"< { out=true; file = vs[i].c_str(); vs.erase(vs.begin() + i);}
}
}(err==true);(vs.size()>0)
{(int i=0; i {<<"comm: неизвестный операнд или ключ '"< };
}tmp;(getline(f1, tmp)) c1.push_back(tmp);(c1.size()==0) { emp1=true;}(getline(f2, tmp)) c2.push_back(tmp);(out==true) out_file.startout(file);(c2.size()==0)
{=true;(emp1==true) { continue; }
{(int i=0;i {< };
}
}(emp1==true && emp2==false)
{ for(int i=0;i {(int i=0; i {(int p=0; p { if(c1[i]==c2[p]) cout< }
}(ontw==false && two==false && twth==false )
{ for(int i=0; i { for(int p=0; p { if(c2[i]==c1[p]) { pre=true; } }(pre==true) { pre=false; continue;} else { cout< {(int i=0; i {(int p=0; p { if(c1[i]==c2[p]) { pre=true; } }(pre==true) { pre=false; continue;}
{ cout< }
}(out==true) out_file.endout();
}
{(was==true) {was=false; continue;}{cout<<"bash: "< }
}0;
} |