Операционные системы / РГР по Операционным системам
.docxМинистерство образования и науки Российской Федерации
Федеральное агентство по образованию
НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Расчётно-графическаязадание
FCс дополнительной опцией сравнения каталогов
Выполнили:
Студентки группы ФБИ – 22
Преподаватель:
Эстрайх И.В.
Новосибирск 2014
Цель работы:
Изучить команду FC, реализовать её на одном из скриптовых языков программирования.
FCкоманда
Сравнение двух файлов или наборов файлов и вывод различий между ними.
/A – вывод только первой и последней строк для каждой группы различий.
/B – сравнение двоичных файлов.
/C – сравнение без учета регистра символов.
/L – сравнение файлов в формате ASCII.
/LBn – максимальное число несоответствий для заданного числа строк.
/N – вывод номеров строк при сравнении текстовых файлов ASCII.
/OFF[LINE] – не пропускать файлы с установленным атрибутом «Автономный».
/T – символы табуляции не заменяются эквивалентным числом пробелов.
/U – сравнение файлов в формате INICODE.
/W – пропуск пробелов и символов табуляции при сравнении.
/nnn – число последовательных совпадающих строк, которое должно встретиться после группы несовпадающих.
[диск1:][путь1]имя_файла1 – указывает первый файл или набор файлов для сравнения.
[диск2:][путь2]имя_файла2 – указывает второй файл или набор файлов для сравнения.
Текст программы.
varArgs; // Коллекция аргументов, передаваемых программе.
varFSObj, WShellObj;
var I, NeedfulArgsObj, AllArgsObj; // Счётчик и переменные для определения корректности ввода аргументов.
var FName1, FName2;
varFolderCompareMode; // Флаг, принимающий значение равное 1 в случае передачи параметра /D.
// Записываем в переменную коллекцию аргументов.
ArgsObj = WScript.Arguments
// Затем Создаём объекты, которые будет использовать.
WShellObj = WScript.CreateObject("WScript.Shell")
FSObj = WScript.CreateObject("Scripting.FileSystemObject")
// Инициализация переменных.
FName1 = "";
FName2 = "";
FolderCompareMode = 0;
NeedfulArgs = 0;
AllArgs = 0;
// Разбираем аргументы.
// Если среди всех есть параметров «/?», то выводим справочную информацию.
for (var i = 0; i <ArgsObj.length; i++)
{
if (ArgsObj(i) == "/?")
{
PrintHelp()
}
}
// Выводим сообщение об ошибке, если количество элементов меньше 2 или больше 3.
if ((ArgsObj.length< 2) || (ArgsObj.length> 3))
{
WriteError();
}
// Всего максимум может быть три аргумента. Смотримихвсе.
for (var i = 0; i <ArgsObj.length; i++)
{
varThisArg; // Строка с разбираемым аргументом.
ThisArg = ArgsObj(i);
if ((ThisArg.indexOf("/F1=", 0) == 0) && (ThisArg.length> 4) && (FName1 == ""))
{
FName1 = ThisArg.substr(4);
NeedfulArgs++;
AllArgs++;
}
if ((ThisArg.indexOf("/F2=", 0) == 0) && (ThisArg.length> 4) && (FName2 == ""))
{
FName2 = ThisArg.substr(4);
NeedfulArgs++;
AllArgs++;
}
if ((ThisArg == "/D"))
{
FolderCompareMode = 1;
AllArgs++;
}
}
// Проверяем на существования файлов/каталогов, переданных через параметры.
if (FolderCompareMode == 1)
{
CheckExistsFolder(FName1);
CheckExistsFolder(FName2);
}
else
{
CheckExistsFile(FName1);
CheckExistsFile(FName2);
}
// Проверяем на успешность обработки аргументов и выполненяем основную часть скрипта.
if ((NeedfulArgs == 2) && (AllArgs == ArgsObj.length))
{
if (FolderCompareMode == 1)
{
WScript.Echo("Сравнениекаталогов " + FSObj.GetBaseName(FName1) + " и " + FSObj.GetBaseName(FName2) + ":");
CompareFolders(FName1, FName2);
CompareFolders(FName2, FName1);
}
else
{
WScript.Echo("Сравнениефайлов " + FSObj.GetFileName(FName1) + " и " + FSObj.GetFileName(FName2) + ":");
CompareFiles(FName1, FName2);
CompareFiles(FName2, FName1);
}
}
else
{
WriteError()
}
// Ниже идёт описание функций и процедур.
// Сравнивание двух текстовых файлов и вывод различий.
functionCompareFiles(FilePath1, FilePath2)
{
var File1, File2, Str1, Str2, N;
// Открываемфайлыдлячтения.
File1 = FSObj.OpenTextFile(FilePath1, 1);
File2 = FSObj.OpenTextFile(FilePath2, 1);
WScript.Echo("--------- Файл " + FSObj.GetFileName(FilePath1));
N = 1; // Номерстроки.
while (!File1.AtEndOfStream)
{
Str1 = File1.ReadLine();
if (!File2.AtEndOfStream)
{
Str2 = File2.ReadLine();
}
if (Str1 != Str2)
{
WScript.Echo(N + ". " + Str1);
}
N++;
}
// Закрываемфайлы.
File1.Close();
File2.Close();
}
// Сравнивание двух каталогов и вывод различий.
functionCompareFolders(FolderPath1, FolderPath2)
{
var Folder1 = FSObj.GetFolder(FolderPath1);
var Folder2 = FSObj.GetFolder(FolderPath2);
var SubFolders1 = new Enumerator(Folder1.SubFolders);
var Files1 = new Enumerator(Folder1.Files);
varFound = 0; // Флаг, сигнализирующий что искомый файл / папка найдена.
WScript.Echo("--------- Папка " + FSObj.GetBaseName(FolderPath1));
// Перебираемпапки.
for (; !SubFolders1.atEnd(); SubFolders1.moveNext())
{
Found = 0;
var SubFolders2 = new Enumerator(Folder2.SubFolders);
for (; !SubFolders2.atEnd(); SubFolders2.moveNext())
{
if (SubFolders1.item().Name == SubFolders2.item().Name)
{
Found = 1;
}
}
if (Found == 0)
{
WScript.Echo("<Папка> " + SubFolders1.item().Name);
}
}
// Перебираемфайлы.
for (; !Files1.atEnd(); Files1.moveNext())
{
Found = 0;
var Files2 = new Enumerator(Folder2.Files);
for (; !Files2.atEnd(); Files2.moveNext())
{
if (Files1.item().Name == Files2.item().Name)
{
Found = 1;
}
}
if (Found == 0)
{
WScript.Echo(Files1.item().Size + " байт " + Files1.item().Name);
}
}
}
// Вывод справочной информации и выход из скрипта.
functionPrintHelp()
{
WScript.Echo("Сравнивает два текстовых файла или два каталога между собой и выводит различия.");
WScript.Echo("Команда fc.js [/F1=имя файла и каталога] [/F2=имя второго файла или каталога] [/D]");
WScript.Echo("Праметр /D включает режим сравнения каталогов.");
WScript.Quit();
}
// Вывод сообщения об ошибке и выход из скрипта.
functionWriteError()
{
WScript.Echo("Ошибка! Для получения сведения о команде «FC» введите её с ключом /?.");
WScript.Quit();
}
// Функция проверяет существование файла. Если файл не существует, Выводит сообщение об этом.
function CheckExistsFile(FilePath)
{
if (FSObj.FileExists(FilePath) == false)
{
WScript.Echo("Файл с таким именем не найден!");
WScript.Quit();
}
}
// Функция проверяет существование папки. Если файл не существует, Выводит сообщение об этом.
function CheckExistsFolder(FolderPath)
{
if (FSObj.FolderExists(FolderPath) == false)
{
WScript.Echo("Папка с таким именем не найдена!")
WScript.Quit();
}
}
Блок-схема программы.
Вывод:
Изучила команду FC и реализовала её на языке VisualBasicScript.