МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
НУ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Кафедра ЕОМ
Курсовий проект
з предмету “Системне програмне забезпечення”
на тему:
“Утиліта архівування системної інформації”
Львів 2019
АНОТАЦІЯ
В курсовому проекті розроблена утиліта архівування системної інформації. Ця утиліта дозволяє заархівувати файли( hosts, protocol, networks, servises). Весь процес архівування виконуються паралельно з використанням Task. Можна заархівувати наступні файли: hosts, protocol, networks, services. Та можливий автозапуск програми із ОС Windows.
Програма розроблена за допомогою Visual Studio 2017 і працює на базі платформи .NET з використанням WinApi функцій, а також розроблені додаткові бібліотеки на мові C# з використанням WinApi.
ЗАВДАННЯ НА КУРСОВУ РОБОТУ
Розробити програму для архівування системної інформації з наступними функціональними блоками:
Стиснення файлів
Можливість перегляду файлів для відновлення та заміною оригіналів ними
Робота в фоновому режимі з таймером стискання
Ефективний алгоритм стиснення
Автозавантаження програми
Програма повинна використовувати стандартні бібліотеки класів платформи .NET і WinApi функції.
ЗМІСТ
Вступ 4
1. Вибір технології програмування 6
1.1. Мова Java 6
1.2. Мова Python 6
1.3. Мова С++……………………………………………………………………6
1.4. Мова С#..……………………………………………………………………7
1.5. Особливості виклику функцій API 8
2. Аналіз завдання та вибір напрямку проектування 10
2.1. Архівування 10
2.2. Бекап 10
2.3. Структура проекту 12
3. Розробка програми 13
3.1. Функціонал 13
3.2. Класи та функції 13
3.3. DEFLATE 20
4.Опис інтерфейсу та інструкції користувача 21
5. Тестування 22
5.1 Виявлення помилок запуску сервісу стиснення. 22
5.2 Ви’явлення помилок відновлення………………...………………………22
5.3. Перевірка на стиснення 23
Висновок 25
Список літератури 26
Додаток А 27
Додаток Б……………………………………………………………………………42
ВСТУП
Архіватор — програмне забезпечення, що використовується для об'єднання, в окремих випадках також стиснення інформації.
Резервне копіювання (бекап) — процес створення копії даних на цифровому носії для подальшого відновлення цих даних в оригінальному місці їх розташування в разі пошкодження або руйнування. Програми для створення резервних копій допомагають полегшити (або повністю автоматизувати) процес створення бекапу даних.
При збереженні, резервному копіюванні інформації тощо часто буває бажано стиснути файли так, щоб вони займали якомога менше місця. Це робиться за допомогою програм, які звуться архіваторами. Ці програми не тільки стискають інформацію в окремому файлі, але можуть і об'єднати в один архів групу файлів.
1. Вибір технології програмування
Для реалізації проекту можна використовувати різні мови програмування і платформи. Серед яких найбільш популярними є c#(.NET), java,С++, Python.
1.1 Java - об'єктно-орієнтована мова програмування, випущена 1995 року компанією «Sun Microsystems» як основний компонент платформи Java. З 2009 року мовою займається компанія «Oracle», яка того року придбала «Sun Microsystems». В офіційній реалізації Java-програми компілюються у байт-код, який при виконанні інтерпретується віртуальною машиною для конкретної платформи.
«Oracle» надає компілятор Java та віртуальну машину Java, які задовольняють специфікації Java Community Process, під ліцензією GNU General Public License.
1.2Python - Розроблена в 1990 році Гвідо ван Россумом. Структури даних високого рівня разом із динамічною семантикою та динамічним зв'язуванням роблять її привабливою для швидкої розробки програм, а також як засіб поєднання існуючих компонентів. Python підтримує модулі та пакети модулів, що сприяє модульності та повторному використанню коду. Інтерпретатор Python та стандартні бібліотеки доступні як у скомпільованій так і у вихідній формі на всіх основних платформах. В мові програмування Python підтримується кілька парадигм програмування, зокрема: об'єктно-орієнтована, процедурна, функціональна та аспектно-орієнтована.
1.3 C++ - мова програмування високого рівня з підтримкою кількох парадигм програмування: об'єктно-орієнтованої, узагальненої та процедурної. Розроблена Б'ярном Страуструпом в AT&T Bell Laboratories 1979 року та початково отримала назву «Сі з класами». Згодом Страуструп перейменував мову на C++ у 1983 р. Базується на мові С. Вперше описана стандартом ISO/IEC 14882:1998, найбільш актуальним же є стандарт ISO/IEC 14882:2014. У 1990-х роках С++ стала однією з найуживаніших мов програмування загального призначення. Мову використовують для системного програмування, розробки програмного забезпечення, написання драйверів, потужних серверних та клієнтських програм, а також для розробки розважальних програм, наприклад, відеоігор. С++ суттєво вплинула на інші популярні сьогодні мови програмування: С# та Java.
1.4 C# - об'єктно-орієнтована мова програмування з безпечною системою типізації для платформи .NET. Розроблена Андерсом Гейлсбергом, Скотом Вілтамутом та Пітером Гольде під егідою Microsoft Research (при фірмі Microsoft).
Синтаксис C# близький до С++ і Java. Мова має строгу статичну типізацію, підтримує поліморфізм, перевантаження операторів, вказівники на функції-члени класів, атрибути, події, властивості, винятки, коментарі у форматі XML. Перейнявши багато що від своїх попередників — мов С++, Delphi, Модула і Smalltalk — С#, спираючись на практику їхнього використання, виключає деякі моделі, що зарекомендували себе як проблематичні при розробці програмних систем, наприклад множинне спадкування класів (на відміну від C++).
Мова С# підтримується фреймворком ASP.NET MVC Core.
1.5 Особливості виклику функцій API
Найбільш перспективним з точки зору програмування є захищений режим, тому що він використовує всі апаратні можливості комп'ютера. Отже, функції API для Windows відіграють ту ж саму роль, що і переривання INT 21h для DOS в реальному або віртуальному режимі, але, відмінності між ними досить суттєві. Перелічимо їх:
функції API не відміняють, а заміняють програмні переривання. Механізм обробки апаратних переривань залишається на рівні драйверів пристроїв;
стандарт виклику функцій API оснований на передачі параметрів через стек (а не через регістри);
значення кожної функції повертається в регістрі EAX. Якщо функція повертає структуру даних, то регістр EAX містить логічну ознаку виконання, а адресу структури необхідно передати до функції як параметр;
функції API працюють у захищеному режимі процесора, а переривання DOS - у реальному чи віртуальному режимі.
2.Аналіз завдання та вибір напрямку проектування
2.1 Архівування.
Можна заархівувати наступні файли: hosts, protocol, networks, services.
hosts - текстовий файл, що містить базу даних доменних імен і використовується при їх трансляції в мережні адреси вузлів. Запит до цього файлу має пріоритет перед зверненням до DNS-серверів. На відміну від DNS, вміст файлу контролюється адміністратором комп'ютера. Величезна кількість шкідливих програм використовують файл hosts для блокування доступу до сайтів популярних порталів і соціальних мереж. Замість блокування сайтів шкідливі програми перенаправляють користувача на сторінки - клони, зовні схожі на популярні соціальні мережі, поштові сервіси і т.д., куди користувач вводить облікові дані, які потрапляють в такий спосіб до зловмисників. Можливо блокування доступу до веб-сайтів компаній-розробників антивірусів. Слід зазначити, що антивірусні програми, як правило, забороняють зміну файлу hosts.
Protocol – текстовий файл що містить інтернет-протоколи і відповідні їх номера. Ці номера використовуються для ініціалізації 8-ми бітного поля “Протокол” в протоколі IP версії 4(IPv4)
Networks – текстовий файл що містить назви мережних посилань для локальних мереж. Номери мережі розпізнаються у десятковій формі.
Servises – тектовий файл що містить номери портів для відомих служб визначених IANA.
2.2 Бекап
Резервне копіювання (бекап) — процес створення копії даних на цифровому носії для подальшого відновлення цих даних в оригінальному місці їх розташування в разі пошкодження або руйнування. Програми для створення резервних копій допомагають полегшити (або повністю автоматизувати) процес створення бекапу даних.
При збереженні, резервному копіюванні інформації тощо часто буває бажано стиснути файли так, щоб вони займали якомога менше місця. Це робиться за допомогою програм, які звуться архіваторами. Ці програми не тільки стискають інформацію в окремому файлі, але можуть і об'єднати в один архів групу файлів.
Існує багато архіваторів. Серед них найвідоміші: DIET, ICE, LHA, LHARC, LZH, LZEXE, NARC, PAK, PKARC, PKLITE, PKXARC, PKPAK, PKZIP, PKUNZIP, RAR, ZOO. Останнім часом з'явилися програми, які, знаходячись у пам'яті комп'ютера резидентно, архівують та розархівовують «на льоту» всі файли, з якими ви працюєте, що дозволяє суттєвим чином заощаджувати простір на жорсткому диску. Такі можливості надають, наприклад, утиліта dblspace для операційної системи MS-DOS та програма DIET.
Існує декілька методів стиснення інформації, що міститься у файлах. Мабуть, найпростішим із них є алгоритм Гаффмана, який полягає в заміні стандартних 8-бітових ASCII-кодів бітовими рядками змінної довжини в залежності від частоти використання символу так, щоб символи, що використовуються частіше, мали меншу довжину. До речі, легко зрозуміти, що у текстах найчастіше зустрічається символ «пробіл», ASCII-код якого має номер 32. Можна поширити цю ідею на пари, трійки і т. д. символів. При цьому можна одержати суттєвий виграш. Дійсно, візьміть, наприклад, дві пари символів «по» та «хщ». Ви можете назвати багато слів із першим сполученням, тоді як інше зустрічається дуже рідко. А при стандартному ASCII-кодуванні на кожне зі сполучень витрачається порівну бітів — по 16. Серед інших методів, які широко застосовуються в архіваторах для стиснення інформації у файлах можна відзначити алгоритм Лемпеля-Зіва.
2.3 Структура проекту
3. Розробка програми
3.1Функціонал
Дана програма повинна мати такий функціонал:
Стиснення файлів системи
Можливість перегляду файлів для відновлення та заміною оригіналів ними
Робота в фоновому режимі з таймером стискання
Ефективний алгоритм стиснення
Автозавантаження програми
3.2 Класи та функції
У даному проекті будуть такі класи:
static class SysInformation – клас генерує шлях до системних файлів.
class time – використовується для таймеру архівування.
class FileObj – клас для представлення файлів, містить поля ім’я та шлях.
class DirectoryObj – клас представлення директорій, містить поля ім’я та шлях.
class class_backup - клас що виконує стискання і розтиснення.
Для вище зазначеного функціоналу програми потрібні такі функції:
public void AddFile() - функція додавання файлу до списку файлів, які будуть стискатись.
public void RemoveFile() - функція для виключення файлу із списку файлів, які будуть стискатись.
public void AddDir() - функція додавання папки до списку папок, які будуть стискатись.
public void RemoveDir() - функція виключення папки із списку папок, які будуть стискатись.
public void Start_compress_service() - функція запуску фонового сервісу бекапу паралельно в окремих Task(задачах).
public void Stop_compress_service() - зупинка сервісу.
public void Compress() - одиночний бекап.
static public void DirectoryCopy() - функція копіювання директорій.
public void compressDir() - функція стискання директорій.
static void WriteDir() - функція запису дерева підкаталогів і стиснетих файлів в одни файл бекапу.
public static void DecompressDir() - розтиснення каталогу.
void compress() - функція стиснення.
public void decompress() - функція розтиснення фалів.
Реалізація класу SysInformation:
static class SysInformation
{
static public string hosts { get; } = Environment.ExpandEnvironmentVariables("%systemroot%") + @"\System32\drivers\etc\hosts";
static public string protocol { get; } = Environment.ExpandEnvironmentVariables("%systemroot%") + @"\System32\drivers\etc\protocol";
static public string networks { get; } = Environment.ExpandEnvironmentVariables("%systemroot%") + @"\System32\drivers\etc\networks";
static public string services { get; } = Environment.ExpandEnvironmentVariables("%systemroot%") + @"\System32\drivers\etc\services";
}
Реаліація класу time:
class time
{
public int Millisecond { private set; get; } = 1000;
public time(int day, int hour, int min, int sec)
{
Millisecond = (sec + 60 * (min + 60 * (hour + day * 24))) * 1000;
}
}
Реалізація класу FileObj:
class FileObj
{
public string name { get; set; }
public string path { get; set; }
public FileObj(string Name, string Path)
{
name = Name;
path = Path;
}
}
Реалізація класу DirectoryObj:
class DirectoryObj
{
public string name { get; set; }
public string path { get; set; }
public DirectoryObj(string Name, string Path)
{
name = Name;
path = Path;
}
}
Реалізація функції AddFile():
public void AddFile(string sysInformation)
{
FileObj f = new FileObj(sysInformation.Split('\\').LastOrDefault(x => true),
sysInformation);
_files.Add(f);
}
Реалізація функції RemoveFile():
public void RemoveFile(string sysInformation)
{
FileObj f = new FileObj(sysInformation.Split('\\').LastOrDefault(x => true),
sysInformation);
_files.RemoveAll((t) => t.name == f.name && t.path == f.path);
}
Реалізація функції AddDir():
public void AddDir(string adddirs)
{
_dirs.Add(new DirectoryObj(adddirs.Split('\\').LastOrDefault(x => true),
adddirs));
}
Реалізація функції RemoveDir():
public void RemoveDir(string sysInformation)
{
DirectoryObj d = new DirectoryObj(sysInformation.Split('\\').LastOrDefault(x => true),
sysInformation);
_dirs.RemoveAll((t) => t.name == d.name && t.path == d.path);
}
Реалізація функції Start_compress_service():
public void Start_compress_service(time Time = null)
{
if (Time != null) _time = Time;
_cycle = true;
_task_file = new Task(() => compress());
_task_file.Start();
_task_dir = new Task(() => compressDir());
_task_dir.Start();
}
Реалізація функції Stop_compress_service():
public void Stop_compress_service()
{
_cycle = false;
}
Реалізація функції Compress():
public void Compress()
{
Task task = new Task(() => compress());
task.Start();
}
Реалізація функції DirectoryCopy():
static public void DirectoryCopy(
string sourceDirName, string destDirName, bool copySubDirs)
{
DirectoryInfo dir = new DirectoryInfo(sourceDirName);
DirectoryInfo[] dirs = dir.GetDirectories();
if (!dir.Exists)
{
throw new DirectoryNotFoundException(
"Source directory does not exist or could not be found: "
+ sourceDirName);
}
if (!Directory.Exists(destDirName))
{
Directory.CreateDirectory(destDirName);
}
FileInfo[] files = dir.GetFiles();
foreach (FileInfo file in files)
{
string temppath = Path.Combine(destDirName, file.Name);
file.CopyTo(temppath, false);
}
if (copySubDirs)
{
foreach (DirectoryInfo subdir in dirs)
{
string temppath = Path.Combine(destDirName, subdir.Name);
DirectoryCopy(subdir.FullName, temppath, copySubDirs);
}
}
}
Реалізація функції compressDir():
public void compressDir()
{
while (true)
{
foreach (var dirObj in _dirs)
{
string currentDir = Environment.CurrentDirectory + @"\back\" + dirObj.name;
Directory.CreateDirectory(currentDir);
DirectoryCopy(dirObj.path, currentDir + @"\" + dirObj.name, true);
string pathSave = currentDir + @"\" + "_D[" +
DateTime.Now.ToString("yy-MM-dd_hh-mm-ss") + "] "
+ dirObj.name + ".def";
FileStream fs = File.Create(pathSave);
fs.WriteByte(0x01); //в 1-ий байт запис "1" ознака що стискається папка
fs.Close();
DirectoryInfo directory = new DirectoryInfo(currentDir + @"\" + dirObj.name);
DirectoryInfo[] directoryInfos = directory.GetDirectories("*", SearchOption.AllDirectories);
foreach (var t in directoryInfos)
{
FileInfo[] fileInfos = t.GetFiles();
foreach (var d in fileInfos)
{
Debug.WriteLine(d.FullName.Replace(currentDir, ""));
WriteDir(pathSave, d.FullName.Replace(currentDir, ""), currentDir);
}
}
DirectoryInfo directoryInfo = new DirectoryInfo(currentDir + @"\" + dirObj.name);
FileInfo[] fileInfos2 = directoryInfo.GetFiles();
foreach (var d in fileInfos2)
{
Debug.WriteLine(d.FullName.Replace(currentDir, ""));
WriteDir(pathSave, d.FullName.Replace(currentDir, ""), currentDir);
}
Directory.Delete(currentDir + @"\" + dirObj.name, true);
}
if (_cycle) Thread.Sleep(_time.Millisecond);
else break;
}
}
Реалізація функції WriteDir():
static void WriteDir(string pathSave, string fileName, string CurrentDir)
{
string currentDir = CurrentDir;
using (FileStream sourceStream = File.Open(currentDir + fileName, FileMode.Open))
{
using (FileStream targetStream = File.Open(pathSave, FileMode.Append))
{
using (FileStream temp = File.Create(currentDir + "temp"))
{
using (DeflateStream compressionStream = new DeflateStream(temp, CompressionMode.Compress))
{
byte[] tmp = Encoding.Default.GetBytes((currentDir + fileName).Replace(currentDir, ""));
targetStream.Write(BitConverter.GetBytes((int)tmp.Length), 0, 4);
targetStream.Write(tmp, 0, tmp.Length);
sourceStream.CopyTo(compressionStream);
compressionStream.Close();
}
}
using (FileStream temp = File.Open(currentDir + "temp", FileMode.Open))
{
targetStream.Write(BitConverter.GetBytes((int)temp.Length), 0, 4);
temp.CopyTo(targetStream);
}
File.Delete(currentDir + "temp");
}
}
}
Реалізація функції DecompressDir():
public static void DecompressDir(string Full_FileName)
{
string currentDir = Environment.CurrentDirectory + @"\back\";
string currFile = Full_FileName.Replace(currentDir, "");
string fileOut = Full_FileName.Remove(0, Full_FileName.Length - Full_FileName.LastIndexOf("] "));
Debug.WriteLine("fileOut=" + fileOut);
using (FileStream sourceStream = File.Open(Full_FileName, FileMode.Open))
{
sourceStream.Position++; //DELETE DELETE DELETE DELETE
while (sourceStream.Position < sourceStream.Length)
{
byte[] lenNameFile = new byte[4];
sourceStream.Read(lenNameFile, 0, 4);
byte[] b_nameFile = new byte[BitConverter.ToInt32(lenNameFile, 0)];
sourceStream.Read(b_nameFile, 0, b_nameFile.Length);
string s_nameFile = currentDir + Encoding.Default.GetString(b_nameFile);
string toCreateDir = s_nameFile.Remove(s_nameFile.LastIndexOf(@"\"),
s_nameFile.Length - s_nameFile.LastIndexOf(@"\"));
Directory.CreateDirectory(toCreateDir);
byte[] b_lenStream = new byte[4];
sourceStream.Read(b_lenStream, 0, 4);
int i_lenStream = BitConverter.ToInt32(b_lenStream, 0);
byte[] tempFile = new byte[i_lenStream];
sourceStream.Read(tempFile, 0, tempFile.Length);
DirCreateDecompress(tempFile, s_nameFile);
}
}
}
Реалізація функції compress():
void compress()
{
while (true)
{
// if (_files.Count == 0) break;
foreach (var file in _files)
{
string file_back = _saveDir + "\\" + file.name;
Directory.CreateDirectory(file_back);
file_back = file_back + "\\" + file.name + ".back";
File.Copy(file.path, file_back, true);
using (FileStream sourceStream = new FileStream(file_back, FileMode.Open))
{
// потік для запису зжатого файлу
using (FileStream targetStream = File.Create(_saveDir + "\\"
+ file.name + "\\"
+ "[" + DateTime.Now.ToString("yy-MM-dd_hh-mm-ss") + "] "
+ file.name + ".def"))
{
// потік архівації
using (DeflateStream compressionStream = new DeflateStream(targetStream, CompressionMode.Compress))
{
sourceStream.CopyTo(compressionStream); // копіюєм байти з одного потоку в інший
compressionStream.Close();
}
}
}
File.Delete(file_back);
}
if (_cycle) Thread.Sleep(_time.Millisecond);
else break;
}
}
Реалізація функції decompress():
public void decompress(string compressedFile,string name)
{
using (FileStream sourceStream = new FileStream(compressedFile, FileMode.OpenOrCreate))
{
using (FileStream targetStream = File.Create(compressedFile.Replace(".def", "")))
{
using (DeflateStream decompressionStream = new DeflateStream(sourceStream, CompressionMode.Decompress))
{
decompressionStream.CopyTo(targetStream);
}
}
string targetPath="";
if (name == "hosts") targetPath = SysInformation.hosts;
if (name == "networks") targetPath = SysInformation.networks;
if (name == "protocol") targetPath = SysInformation.protocol;
if (name == "services") targetPath = SysInformation.services;
File.Copy(compressedFile.Replace(".def", ""),targetPath,true);
File.Delete(compressedFile.Replace(".def", ""));
}
}
3.3 DEFLATE
У цьому проекті я використав алгоритм стиснення без втрат DEFLATE який базується на двох базових алгоритмах: LZ77 і кодуванні Хаффмана.
LZ77 шукає у вхідному потоці даних, що повторюються, і замінює всі повторні їх входження посиланнями. У бінарних даних це досить рідкісна ситуація, але в тексті це відбувається набагато частіше, і це дає можливість домогтися істотного стиснення вже на цьому етапі.
Таким чином, під час проходу по тексту алгоритм LZ77 становить словник з повторюваних фрагментів, і зустрічаючи старий фрагмент, замінює його номером фрагмента зі словника.
Далі працює алгоритм Хаффмана, який підраховує частоту вживання кожного фрагмента зі словника, і призначає частим фрагментами більш короткий номер - так ми скорочуємо самі номери фрагментів. Доведено, що код Хаффмана дуже близький до теоретичної межі ступеня стиснення.
Ці алгоритми можна використовувати, наприклад, для стиснення JSON-повідомлень - в типовому випадку ви отримаєте ступінь стиснення від 30% (для коротких повідомлень) до 2 разів (якщо повідомлення довше 500 байт) і більше.
4.Опис інтерфейсу та інструкції користувача
Утиліту «Архіватор» можна запустити з виконавчого файлу kursova_backup_sys_file.exe. Для її запуску необхідно платформу.NET 2.0, Windows не нижче 2000.
Рис. 4.1 Головне вікно програми
В утиліті присутні наступні функції:
відображення системних файлів;
відображення файлів у редервній копії з датою і часом;
вибір часу періодичності архівації;
увімкнення та вимкнення сервісу стискання;
Щоб вибрати файли достатньо поставити відповідну позначку навпроти файлу який необхідно зарезервувати, налаштувати таймер та запустити сервіс стискання.
Для відновлення потрібно оновити дані про файли вибрати папку та обрати файл з потрібним часом для відновлення та нажати відновити. Файл розархівується та замінить теперішній файл в системі.
Всі дані відображаються структуровано у вигляді таблиці і є інтуїтивно зрозумілими.
5. ТЕСТУВАННЯ
Відлагодження програми відбувається на основі спеціально створених тестів за допомогою автоматизованого відлагоджувача який присутній в середовищі Ms Visual Studio 2017, в покроковому режимі перевіряється значення потрібних змінних і вмістиме потрібних структур даних. За допомогою breakpoints відбувається запинка виконання програми в тих місцях де відбулася логічна помилка або в місцях визначених студентом.
5.1 Виявлення помилок запуску сервісу стиснення.
До помилок на цьому етапі відносяться помилки відсутності файлів у системі. Такі ситуації виключені.
Рис.5.1.1 Результат виконання стиснення
5.2 Виявлення помилок відновлення.
До помилок на цьому етапі відносяться помилки процесу відновлення. Якщо під час запуску програми немає прав адміністратора програма повідомить про помилку, оскільки це системні файли і потрібно запустити прогарму від імені адміністратора.
Рис.5.2.1 Результат відновлення.
5.3 Перевірка на стиснення.
Рис.5.3.1 Результат стиснення файлу hosts.
На рис.5.3.1 видно що стиснутий файл майже у двічі менший(1,835) за обємом ніж оригінал що вказує на коректність алгоритму стиснення.
Рис.3.5.2 Результат стиснення файлу services.
На рис.5.3.2 видно що стиснутий файл у 4.5 рази менший за обємом ніж оригінал що вказує на коректність алгоритму стиснення.
ВИСНОВОК
В процесі виконання курсового проекту було виконано наступне:
Розроблено програму архівування
Проведено тестування на системних файлах
Розроблено бекап для системних файлів
В результаті виконання даної курсової роботи засвоєно технології розробки веб аплікацій з використанням найновіших технологій:
середовища Visual Studio 2017, платформи .Net Core 2 та С# 7.0.
СПИСОК ЛІТЕРАТУРИ
В. Зиборов Visual C# 2010 на примерах
Системное программное обеспечение / А.В.Гордеев, А.Ю.Молчанов.
Э. Троелсен Язык программирования C# 2010 и платформа .NET 4.0
Колисниченко Секреты, настройка и оптимизация реестра Windows 7
Дж.Донован. Системное программирование.
ДОДАТОК А
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Win32;
namespace writer
{
static class SysInformation
{
static public string hosts { get; } = Environment.ExpandEnvironmentVariables("%systemroot%") + @"\System32\drivers\etc\hosts";
static public string protocol { get; } = Environment.ExpandEnvironmentVariables("%systemroot%") + @"\System32\drivers\etc\protocol";
static public string networks { get; } = Environment.ExpandEnvironmentVariables("%systemroot%") + @"\System32\drivers\etc\networks";
static public string services { get; } = Environment.ExpandEnvironmentVariables("%systemroot%") + @"\System32\drivers\etc\services";
}
class time
{
public int Millisecond { private set; get; } = 1000;
public time(int day, int hour, int min, int sec)
{
Millisecond = (sec + 60 * (min + 60 * (hour + day * 24))) * 1000;
}
}
class FileObj
{
public string name { get; set; }
public string path { get; set; }
public FileObj(string Name, string Path)
{
name = Name;
path = Path;
}
}
class DirectoryObj
{
public string name { get; set; }
public string path { get; set; }
public DirectoryObj(string Name, string Path)
{
name = Name;
path = Path;
}
}
class class_backup
{
public List<FileObj> _files = new List<FileObj>();
public List<DirectoryObj> _dirs = new List<DirectoryObj>();
private string _saveDir = Environment.CurrentDirectory + "\\back";
private time _time;
Task _task_file;
Task _task_dir;
private bool _cycle = false;
public class_backup()
{
// _saveDir = Environment.CurrentDirectory + "\\backup";
Directory.CreateDirectory(_saveDir);
}
public void AddFile(string sysInformation)
{
FileObj f = new FileObj(sysInformation.Split('\\').LastOrDefault(x => true),
sysInformation);
//_files.Add(new FileObj(sysInformation.Split('\\').LastOrDefault(x => true),
// sysInformation));
_files.Add(f);
//_files.Remove(f);
}
public void RemoveFile(string sysInformation)
{
FileObj f = new FileObj(sysInformation.Split('\\').LastOrDefault(x => true),
sysInformation);
_files.RemoveAll((t) => t.name == f.name && t.path == f.path);
}
public void RemoveDir(string sysInformation)
{
DirectoryObj d = new DirectoryObj(sysInformation.Split('\\').LastOrDefault(x => true),
sysInformation);
_dirs.RemoveAll((t) => t.name == d.name && t.path == d.path);
}
public void AddDir(string adddirs)
{
_dirs.Add(new DirectoryObj(adddirs.Split('\\