Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Інститут комп'ютерних технологій, автоматики та метрології
Кафедра ЕОМ
Курсовий проект
з предмету “Системне програмне забезпечення”
на тему:
Розробка програми – утиліти для дефрагментації жорсткого диску
Львів – 2013
ЗАВДАННЯ
Розробити програму - утиліту для дефрагментації.
Утиліта повинна здійснювати дефрагментацію інформації, що знаходиться на жорсткому диску.
Утиліта повинна мати такий функціонал:
Пошук фрагментованої інформації
Дефрагментація фрагментованої інформації
Утиліта повинна бути орієнтованою на операційну систему сімейства Windows.
Мова написання програми – утиліти: C/C++
АНОТАЦІЯ
У даному курсовому проекті мною було розроблено утиліту, за допомогою якої можна здійснювати пошук і дефрагментацію жорстких дисків, а також пошук і перегляд інформації про к-сть фрагментованих файлів і дерикторій. Реалізовано відображення процесу дефрагментації. Для організації такої роботи реалізовано використання API-функцій.
Зміст
Вступ 5
1. Огляд дефрагментаторів 6
1.1 Загальні відомості 6
1.2 Популярні утиліти-дефрагментатори 7
1.2.1 Програма Windows Disk Defragmenter 7
1.2.2 Дефрагментатор Diskeeper 2009 8
1.2.3 Утиліта UltraDefrag. 9
1.2.4 Програма Auslogics Disk Defrag 10
1.2.5 Програма O & O Defrag 11
2. Аналіз завдання та вибір напрямку розробки 13
2.1. Аналіз завдання 13
2.2. Вибір середовища та мови програмування 15
2.3. Вибір технології програмування 15
2.4. Вибір та розробка структур даних і функцій 15
3. Розробка компонент програмної реалізації 19
3.1. Розробка 19
3.2. Структурні елементи утиліти 20
3.3. Алгоритм роботи утиліти 25
4. Інструкція користувача та результати тестування 27
4.1. Інструкція користувача. 27
4.1.1. Установка і запуск 27
4.1.2. Вікно утиліти 27
4.2. Результати тестування 30
Висновки 33
Спискок літератури 34
Додаток 2. Блок-схема алгоритму 35
Додаток 3. Код програми 36
Вступ
Використовуючи операційні системи сімейства Windows користувачі стають прив'язаними до конкретних файлових систем. Найбільш часто використовуються, такі файлові системи для жорстких дисків, як NTFS і FAT32. Ці системи мають безліч відмінностей, але їх схожість полягає у фрагментації файлів, так як в програмах для роботи з ними зазвичай не передбачено жодних засобів для запобігання фрагментації.
Великі дані записуються на диск в декількох кластерах. Якщо місця для запису певного файлу достатньо, то всі кластери розміщуються послідовно. Однак якщо простір частково заповнений, великому файлу може не знайтися цільної вільної області для його розміщення. У такому випадку дані будуть записані у вільні кластера, за умови, що їх сумарний обсяг задовольняє даний файл. В цьому випадку файл записується у вигляді декількох фрагментів. Більше того: у багатьох файлових системах (приклад FAT32) початок файлу записується в початок кластера, отже, якщо сам файл або його частину за об'ємом менше розміру кластера, то місце, що залишилося в кластері залишається невикористаним. Тому фрагментованість диска обернено пропорційна ефективності використання його простору.
1. Огляд дефрагментаторів
1.1 Загальні відомості
Фрагментація дискового простору це ефект, що виникає в процесі активної роботи з файлами (створення, видалення, переміщення, зміна розмірів) і виражається у відсутності на жорсткому диску достатньої кількості послідовних вільних блоків. На фрагментованому диску вільні блоки розкидані по всій поверхні диска, і при подальшій роботі з диском, це призводить до фрагментації даних.
Так ми можемо сказати, що фрагментація даних є негативним ефектом. Дроблення файлів ускладнює роботу з ними і збільшує навантаження на апаратну частину комп'ютера. На сильно фрагментованих областях жорсткого диску буде потрібно затратити набагато більше часу для запису або зчитування файлу, ніж на малофрагментованих областях. Це пояснюється тим, що велика кількість кластерів зайнятих конкретним файлом розташовуються не послідовно, а, можна сказати, хаотично розкидані по всьому об'єму диску вінчестера. І саме цей факт змушує зчитувальну головку витрачати зайвий час на пошук чергової частини файлу.
Таким чином, можна зробити висновок, що мінімальна фрагментація не тільки збільшить швидкодію системи, але і збільшить термін служби деяких пристроїв.
Щоб уникнути фрагментації дискового простору необхідно проводити процес дефрагментації.
“Дефрагментація - процес оновлення і оптимізації логічної структури розділу диску з метою забезпечення зберігання файлів в безперервній послідовності кластерів. Після дефрагментації прискорюється читання і запис файлів, а отже і робота програм. Інше визначення дефрагментації: перерозподіл файлів на диску, при якому вони розташовуються в безперервних областях”
1.2 Популярні утиліти-дефрагментатори
Фрагментовані файли ніяк не порушують роботу обчислювальної системи, але значно впливають на її швидкодію. З цієї причини розробляються нові алгоритми дефрагментації файлів і створюються різні програми, які виконують цей процес.
На даний момент користувачеві доступні десятки різних платних і безкоштовних програмних продуктів. Кожен з них гідний уваги, але можна виділити найбільш якісні і популярні програми. Однак «кращого» визначити не можливо, і користувачеві залишається зробити вибір: яким дефрагментатором користуватися.
1.2.1 Програма Windows Disk Defragmenter
Даний дефрагментатор є стандартним засобом Windows.
Має простий інтерфейс, графічне відображення стану диска (Рис. 1.1.).
/
Рис. 1.1. Інтерфейс Windows Disk Defragmenter.
Він дозволяє працювати з файловими системами FAT, FAT32 і NTFS. Дефрагментації піддається більшість необхідних файлів. Даний продукт має безліч недоліків, основними, з яких, можна вважати: малу продуктивність, мінімальний спектр настройок, наявність 15% вільного дискового простору для початку процес дефрагментації. Також програма не об'єднує вільний простір, що незабаром приведе до більш частої фрагментації. Не організована функція автоматичної дефрагментації. Через погану роботу дану програму не слід використовувати для основного засобу дефрагментації.
1.2.2 Дефрагментатор Diskeeper 2009
Diskeeper є популярним пакетом для дефрагментації жорсткого диска. Підтримує файлові системи NTFS, FAT16 і FAT32. Програма здатна працювати з томами більше 1 Тб, великими файлами, сильно фрагментованими файлами, системними файлами, MFT. По завіреннях розробників для роботи дефрагментатора достатньо 1% вільного дискового простору, але на практиці великі файли просто пропускаються. На жаль програма має низьку швидкість роботи, в порівнянні з іншими рішеннями.
Програма має безліч налаштувань, але в теж час залишається простою для використання (Мал. 1.2.). Всі функції легко зрозумілі, що дозволяє швидко розпочати роботу, не витрачаючи зайвого часу на пошук необхідної операції.
/
Рис. 1.2. Інтерфейс Diskeeper 2009.
Після проведення Аналізу диска користувачеві представляють детальний звіт про файли, їх розташування, стані.
Diskeeper може працювати в автоматичному режимі і в ручному. У першому випадку, завдяки спеціальній технології, програма самостійно приймає рішення щодо процесу дефрагментації і застосовуваного методу. Також можливо створити розклад дефрагментації. В ручному режимі процес дефрагментації ініціюється користувачем, вибір методу і пріоритету також. Для ручного режиму доступно два варіанти роботи «Quick» і «Recommended». При використанні першого методу забезпечується висока швидкість роботи при малій ефективності. Це пояснюється тим, що при роботі не проводиться об'єднання вільних областей. Режим «Recommended» більш тривалий, використовує більше системних ресурсів.
В цьому випадку проводиться дефрагментація файлів і часткове об'єднання вільного простору диска. Для цього режиму можливо використовувати автоматичне визначення пріоритету дефрагментації
1.2.3 Утиліта UltraDefrag.
Маленький безкоштовний дефрагментатор. До основних переваг можна віднести відкритий програмний код, високу швидкість роботи, мале споживання системних ресурсів, простий інтерфейс.
Програма може працювати як консольний додаток, так і з графічним інтерфейсом. Завдяки консольному режиму організована дефрагментація за розкладом, дефрагментація певних файлів і папок. Графічний режим наочно відображає карту диска, кластери зображені блоковою системою розфарбованою різними кольорами, які відповідають типам файлів і ступенем фрагментації (Мал. 1.3.).
/
Рис. 1.3. Інтерфейс Ultradefrag.
Однак UltraDefrag використовує слабкий алгоритм дефрагментації. Програма не здатна сортувати файли по частоті доступу або ж на ім'я, не дефрагментує вільний простір. Незважаючи на ці недоліки, після завершення процесу дефрагментації відчувається значний приріст продуктивності. Програма генерує звіти у форматі HTML. Має 32-х бітні і 64-х бітні версії.
1.2.4 Програма Auslogics Disk Defrag
Auslogics Disk Defrag безкоштовне рішення дефрагментації жорстких дисків. Має приємний зрозумілий інтерфейс (Мал. 1.4).
/
Рис. 1.4. Інтерфейс Auslogics Disk Defrag.
Висока швидкість роботи і наявність самих необхідних опцій роблять цю програму дуже зручним інструментом для роботи з жорстким диском. Незважаючи на відносно малі обсяги, є дуже хорошим засобом дефрагментації. Однак найчастіше програма пропускає великі файли, це відбувається в разі відсутності відповідного нерозділеного обсягу вільного місця на диску. Програма не здатна проводити дефрагментацію вільного простору. Також не проводиться дефрагментація заблокованих системою файлів.
Програма має українську і російську локалізації, останню версію можна безкоштовно завантажити на офіційному сайті.
У програмі можна вказати винятки - папки, які не слід дефрагментувати. Перед початком процесу дефрагментації програма може видалити тимчасові файли, що дозволить виконати роботу швидше, очистити місце на диску і прискорити роботу системи. В налаштуваннях можна вибрати дефрагментацію всього диска, папки або окремого файлу. Програма може працювати за розкладом і підтримує автодефрагментацію.
Відразу після виконання дефрагментації користувачеві видається короткий звіт, в якому виділені найважливіші відомості. Також можна переглянути повний звіт.
1.2.5 Програма O & O Defrag
Потужний програмний пакет для дефрагментації диска. O & O Defrag виділяється завдяки унікальним технологіям. ActivityGuard стежить за роботою комп'ютера і непомітно проводить дефрагментацію, самостійно змінюю свою активність в залежності від основних завдань, що виконуються на даний момент. Технологія OneButtonDefrag дозволяє проводити дефрагментацію відповідно до заданих установками, при певному рівні фрагментації.
Дефрагментація може проводитися під час простою системи, за розкладом, в ручному режимі. Для початку роботи потрібно понад 5% вільного простору на диску. Програма дозволяє дефрагментувати окремий диск або все, окремий файл, конкретну папку. Однак іноді виникають проблеми з дефрагментацією окремих файлів. Якщо програмі не вдається знайти достатнього вільного об'єму, вона відзначає відсоток виконаної роботи і переходить в недоступний режим (програма не відповідає), в таких ситуаціях доводиться завершувати процес. Після такого використовувати програму вдасться тільки після запуску відповідної служби.
Користуватися програмою досить просто. Всі можливості програми згруповані в чотири вкладки: Дефрагментація, Звіти, Декорація Довідка. Інтерфейс зручний і інтуїтивно зрозумілий (Мал. 1.5.).
Після закінчення аналізу і виконання дефрагментації можна переглянути зручний детальний звіт.
/
Рис. 1.5. Інтерфейс O & O Defrag.
Організовано кілька різних режимів дефрагментації. Це найпоширеніші з них: Прихована (швидка) дефрагментація (Stealth), Дефрагментація вільного місця (Space), Ім'я (Complete / Name), Змінений (Complete / Modified), Доступ (Complete / Access).
2. Аналіз завдання та вибір напрямку розробки
2.1. Аналіз завдання
Процес дефрагментації файлу можна розділити на два основних етапи: аналіз файлу, пошук кластерів цього файлу, їх розташування, пошук області диска для переміщення фрагментованих даних; безпосередньо сама дефрагментація — переміщення кластерів файлу у відведене місце, яке задовольняє його об'єм.
Алгоритми дефрагментації:
Проста дефрагментація — даний спосіб використовується найбільш часто і є найбільш простим в реалізації, швидким серед інших алгоритмів. Проводиться сканування диска в пошуках всіх кластерів одного файлу. Після складання карти файлу його фрагменти переміщуються в вільне місце, в яке може поміститися файл цілком. Таким чином, всі файли, які не представляють собою безперервні ланцюжки кластерів. На першому етапі задається файл, який необхідно дефрагментувати. Далі проводиться пошук всіх кластерів займаним файлом. Якщо кластери не утворюють нероздільний ланцюжок - це означає, що файл фрагментований. На наступному етапі проводиться пошук відповідного місця для переміщення файлу. Після успішного виконання попереднього кроку виконується переміщення кластерів файлу в нове місце на диску. Якщо ж місце для файлу не знайдено (особливо актуально для великих за обсягом файлів), то він пропускається і залишається фрагментованим.
На малюнках 2.1. і 2.2. представлений, в графічному вигляді, принцип роботи алгоритму. На малюнку 2.3. зображені умовні позначення.
/
Рис. 2.1. Область диску до дефрагментації.
/ Рис. 2.2. Використаний «простий» метод.
/
Рис. 2.3. «Легенда».
Дефрагментація вільного місця або повна дефрагментація — метод повної дефрагментації або дефрагментації вільного місця використовувався одним з перших. Даний спосіб дефрагментує всі файли і поміщає їх у початку розділу, що дозволяє звільнити максимально можливу вільну область диска. Після проведення дефрагментації всі файли будуть розташовані в сусідніх областях, утворюючи, таким чином, безперервний ланцюжок.
Дефрагментація часто використовуваних даних — такий метод розміщає файли на жорсткому диску згідно з частотою їх використання. Такий метод займає тривалий проміжок часу і вимагає великих ресурсів. Найчастіше даний метод застосовується на серверних машинах.
За датою останньої зміни — даний метод сортує і розміщує дані на диску згідно часу їх останньої зміни. Він проводить повну реорганізацію структуру розміщення файлів на диску. На виконання повною дефрагментації потрібно багато часу. Даний метод рідко використовують на домашніх комп'ютерах або ноутбуках. Його ефективніше використовувати на серверних машинах.
Сортування по імені — алгоритм повної дефрагментації з можливістю сортування файлів. Метод реорганізує файлову структуру таким чином, що файли будуть розташовуватися на диску відповідно до алфавіту. Такий метод зазвичай використовують на системних дисках. Сортування по імені дозволяє скоротити час доступу до файлу в каталогах.
Для вибору алгоритму було оцінено більшість методів. Для досягнення високої швидкості роботи, і як наслідок, малого витраченого часу на проведення операції дефрагментації, програми слід підібрати відповідний алгоритм.
Оптимальним був обраний «простий» метод. Так як він виконує дефрагментацію без сортувань і зміни файлової структури, ефективний для більшості файлів, легкий в реалізації - це робить його лідером серед інших алгоритмів. Для користувача дефрагментація за допомогою такого алгоритму дозволить швидко з'єднати всі фрагменти файлу, не витрачаючи великих кількість системних ресурсів.
Використання такого методу дозволить швидко і зручно виконувати дефрагментацію часто фрагментованих файлів. Користувач може вказати необхідні для дефрагментації файли, що дозволить не зачіпати інші файли.
2.2. Вибір середовища та мови програмування
Цільовою мовою програмування було обрано C++. Дана мова програмування широко використовується для розв’язання задач різного рівня складності. Перевагами даної мови порівняно з іншими є широкий набір бібліотек класів для роботи з стрічками, файлами, різноманітними структурами даних.
Оскільки утиліта орієнтована на сімейство операційних систем Windows, то для її розробки будуть використовуватись Windows API функції - набір базових функцій інтерфейсів програмування. Вони дадуть змогу просто і зручно отримувати інформацію про потрібні нам параметри. Нижче буде наведено основні функції які нам потрібні для роботи та їх опис.
2.3. Вибір технології програмування
Технологією програмування було обране процедурне програмування. Виконання програми зводиться до послідовного виконання операторів з метою перетворення початкового стану пам'яті, тобто значень вихідних даних, в заключне, тобто в результати. Таким чином, з точки зору програміста є програма і пам'ять, причому перша послідовно оновлює вміст останньої.
Процедурна мова програмування надає можливість програмісту визначати кожен крок у процесі рішення задачі. Особливість таких мов програмування полягає в тому, що завдання розбиваються на кроки і вирішуються крок за кроком. Використовуючи процедурну мову, програміст визначає мовні конструкції для виконання послідовності алгоритмічних кроків.
2.4. Вибір та розробка структур даних і функцій
За допомогою функції GetVolumeInformation можна отримати інформацію про файлову систему логічного розділу і її властивості.
GetVolumeInformation (
LPCTSTR lpRootPathName, //Кореневий каталог
LPTSTR lpVolumeNameBuffer, //Мітка розділу
DWORD nVolumeNameSize, //Обсяг розділу
LPDWORD lpVolumeSerialNumber, //Серійний номер
LPDWORD lpMaximumComponentLength, //Макс. довжина імен
LPDWORD lpFileSystemFlags, //Системні прапорці
LPTSTR lpFileSystemNameBuffer, //Назва файлової системи
DWORD nFileSystemNameSize //Довжина назви
);
За допомогою функції GetDiskFreeSpace можна отримати інформацію про обсяг вільного простору на диску.
GetDiskFreeSpace (
LPCTSTR lpRootPathName, //Кореневий каталог
LPDWORD lpSectorsPerCluster, //Число секторів в кластері
LPDWORD lpBytesPerSector, //Число байтів в секторі
LPDWORD lpNumberOfFreeClusters, //К-ть вільних кластерів
LPDWORD lpTotalNumberOfClusters //Загальна к-ть кластерів
);
Функція DeviceIoControl здійснює безпосередню взаємодію з драйвером пристрою, посилаючи йому команду, що дозволяє управляти цим пристроєм або отримати про нього інформацію. Це багатоцільова функція управління введенням- виведенням (IOCTL). Фактично, DeviceIoControl являє собою безліч функцій, вид яких задається її параметром dwIoControlCode. У даному розділі розглянемо використання цієї функції для отримання інформації про диски.
За допомогою функції DeviceIoControl можна отримати доступ не тільки до логічних, а й до фізичних дисків. Дескриптор диска, інформацію про який ви хочете отримати, задається першим параметром функції. Цей дескриптор повертається функцією CreateFile, яка повинна бути попередньо викликана. При цьому повинні бути виконані наступні вимоги:
Щоб відкрити фізичний жорсткий диск з номером Х, шлях до файлу - аргумент lpFileName у виклику CreateFile повинен мати форму "\\.\PHYSICALDRIVEx". Номери жорсткого диска починаються з нуля. Наприклад: "\\.\PHYSICALDRIVE0" - це перший фізичний диск комп'ютера користувача.
Щоб відкрити один з логічних дисків, на які розбитий фізичний диск, шлях до файлу - аргумент lpFileName у виклику CreateFile повинен мати форму "\\.\X:", де х - буква диска (регістр літери не має значення).
Аргумент dwCreationDistribution у виклику CreateFile повинен мати прапор OPEN_EXISTING.
При відкритті жорсткого диска ви повинні в аргументі dwShareMode у виклику CreateFile встановити прапор FILE_SHARE_WRITE.
За допомогою функції FindFirstFile можна отримати інформацію про перший файл в директорії.
HANDLE FindFirstFile(
LPCTSTR lpFileName, // ім’я файла
LPWIN32_FIND_DATA lpFindFileData // буфер даних
);
За допомогою функції FindNextFile можна отримати інформацію про наступний файл в директорії.
BOOL FindNextFile(
HANDLE hFindFile // дескриптор пошуку
LPWIN32_FIND_DATA lpFindFileData // буфер даних
);Структура містить початковий логічний кластер.
typedef struct {
LARGE_INTEGER StartingLcn; // початковий кластер
} STARTING_LCN_INPUT_BUFFER, *PSTARTING_LCN_INPUT_BUFFER;
Структура містить масив кластерів, що належать файлу.
typedef struct RETRIEVAL_POINTERS_BUFFER {
DWORD ExtentCount; // к-ть кластерів
LARGE_INTEGER StartingVcn; // початковий віртуальний кластер
struct {
LARGE_INTEGER NextVcn; // наступний віртуальний кластер
LARGE_INTEGER Lcn; // логічний кластер
} Extents[1];
} RETRIEVAL_POINTERS_BUFFER, *PRETRIEVAL_POINTERS_BUFFER;
Структура містить початковий віртуальний кластер.
typedef struct {
LARGE_INTEGER StartingVcn; // початковий кластер
} STARTING_VCN_INPUT_BUFFER, *PSTARTING_VCN_INPUT_BUFFER;
Структура містить набір групу послідовних кластерів, що належать файлу
typedef struct {
HANDLE FileHandle; // дескриптор файлу
LARGE_INTEGER StartingVcn; // початковий віртуальний кластер
LARGE_INTEGER StartingLcn; // початковий логічний кластер
DWORD ClusterCount; // к-ть сластерів
} MOVE_FILE_DATA, *PMOVE_FILE_DATA;
Структура містить інформацію про логічний розділ.
typedef struct {
PARTITION_STYLE PartitionStyle; // Стиль розділу
LARGE_INTEGER StartingOffset; // Зміщення початку
LARGE_INTEGER PartitionLength; // Довжина розділу
DWORD PartitionNumber; // Номер розділу
BOOLEAN RewritePartition; // Повертає розділ
union {
PARTITION_INFORMATION_MBR Mbr; // Стиль розділу Mbr
PARTITION_INFORMATION_GPT Gpt; // Стиль розділу Gpt
};
} PARTITION_INFORMATION_EX;
3. Розробка компонент програмної реалізації
3.1. Розробка
Для ефективного розв’язання поставленої задачі, усю програму було розділено на декілька функцій, кожна з яких чітко має своє призначення і виконує певні дії у загальному алгоритмі функціонування програми:
main
GetLetters
Search
Dir
GetFiles
GetClusters
ProcessVolume
FindFreeBlock
Defrag
3.2. Структурні елементи утиліти
Табл. 3.1 Структурні елементи утиліти
Назва поля
Опис
Змінні
int files;
Містить кількість просканованих файлів і дерикторій на логічному диску
bool sh;
Відповідає за відображення проміжних результатів під час сканування диску
ULONG64 MaxLcn;
Максимальний логічний сластер
list<string> frag_files;
Список фрагментованих файлів і дерикторій
DWORD ClusterSize;
Розмір кластера вибраного логічного диску
struct {
ULONG64 Start;
ULONG64 End;
} Excludes[3];
Масив кластерів в які не можна записувати дані
Функції
void main()
Головна функція.
list<char> GetLetters()
Отримує логічні диски.
Не приймає жодних значень.
Повертає список логічних дисків.
void Search(char let)
Викликає пошук всіх файлів і дерикторій на логічному диску.
Приймає на вхід букву логічного диска.
Не повертає жодних значень.
void Dir(char *root)
Шукає всі піддиректорії в даної .
Приймає на вхід рядок з директорією.
Не повертає жодних значень.
void GetFiles(char* way)
Шукає всі файли в даній директорії.
Приймає на вхід рядок з директорією
Не повертає жодних значень.
int GetClusters(const char* name,bool d)
Визначає чи кластери файла є послідовними / переміщає блоки кластерів файла
Приймає на вхід рядок з ім’ям файлу, змінну, що визначає виконувати першу чи другу операцію.
Повертає к-ть блоків кластерів/одиницю при успішному виконанні.
void ProcessVolume(HANDLE VolumeName)
Отримує інформацію про кластери, запис в які заборонений.
Приймає на вхід дескриптор логічного диска
Не повертає жодних значень.
int FindFreeBlock(HANDLE VolumeHandle,ULONG64 MinimumLcn,DWORD MinimumSize,ULONG64 *BeginLcn,ULONG64 *EndLcn)
Виконує пошук вільного блоку для розміщення файлу чи директорії.На вхід приймає дескриптор логічного диску для пошуку, логічний сектор з якого потрібно починати пошук, розмір який потрібно шукати, вказівник на змінну в яку буде записуватись початковий логічний кластер для запису, вказівник на змінну в яку записується кінцевий логічний кластер для запису.
Не повертає жодних значень.
int Defrag()
Перебирає всі фрагментовані файли і відправляє їх на де фрагментацію.
Не приймає на вхід жодних значень.
Повертає 1 при успішному виконанні.
Детальний опис роботи функцій:
list<char> GetLetters();
Перебираються всі букви, які можуть отримати логічні диски
За допомогою функції CreateFile відкриваєм диск
Перевіряєм чи диск відкрився
Якщо диск не відкрився завершуєм роботу з ним
Якщо диск відкрився продовжуєм роботу з ним
Відкриваєм диск для отримання нформації про нього DeviceIoControl з IOCTL_DISK_GET_PARTITION_INFO_EX, GetVolumeInformation, GetDiskFreeSpace
Закриваєм диск з яким працювали
void Search(char let);
За допомогою функції CreateFile відкриваєм диск
Відкриваєм диск для отримання нформації про нього GetDiskFreeSpace
Викликаєм функцію Dir
void Dir(char *root);
Викликаєм функцію для отримання інформації про кластери GetClusters
Шукаєм в даній директорії піддиректорію FindFirstFile
Перевіряєм директорію
Якщо піддиректорії не знайдено завершуєм роботу
Якщо знайдено піддиректорію продовжуєм роботу
Викликаєм функцію GetFiles для отримання файлів
Викликаєм функцію Dir для отримання піддиректорій
Продовжуєм повторювати попередні 3 пункти поки функція FindNextFile повертає значення
void GetFiles(char* way);
Шукаєм в даній директорії піддиректорію FindFirstFile
Перевіряєм директорію
Якщо піддиректорії не знайдено завершуєм роботу
Якщо знайдено піддиректорію продовжуєм роботу
Викликаєм функцію GetClusters для отримання інформації про кластери
Продовжуєм повторювати попередні 2 пункти поки функція FindNextFile повертає значення
int GetClusters(const char* name,bool d);
За допомогою функції CreateFile відкриваєм файл або директорію
За допомогою функції CreateFile відкриваєм диск
Перевіряєм файл або директорію чи диск
Якщо файл або директорію чи диск не відкрився завершуєм роботу з ними
Якщо файл або директорію чи диск відкрився продовжуєм роботу з ними
За допомогою функції GetFileSizeEx отримуєм розмір файлу або директорії
Відкриваєм файл або директорію для отримання інформації про кластери за допомогою функції DeviceIoControl з FSCTL_GET_RETRIEVAL_POINTERS
Перевірка 2-го параметру
Якщо він рівний 0 повертаєм к-ть блоків кластерів
Якщо він рівний 1 продовжується робота функції
Викликаєм функцію ProcessVolume для отримання інформації про сектори диску
Викликаєм функцію FindFreeBlock для пошуку вільного місця потрібного для переміщення
Переміщаєм файл або директорію за допомогою функції DeviceIoControl з FSCTL_MOVE_FILE
Закриваєм диск та файл або директорію
void ProcessVolume(HANDLE VolumeName);
Задопомогою функції DeviceIoControl з FSCTL_IS_VOLUME_MOUNTED перевіряєм чи диск змонтовано
Якщо диск не змонтовано завершуєм роботу з ним
Якщо диск змонтовано продовжуєм роботу з ним
За допомогою функції DeviceIoControl з FSCTL_GET_VOLUME_BITMAP отримуєм карту диску
Якщо карту диску не отримано завершуєм роботу з ним
Якщо карту диску отримано продовжуєм роботу з ним
За допомогою функції DeviceIoControl з FSCTL_GET_NTFS_VOLUME_DATA отримуєм інформацію про диск
Якщо інформацію не отримано завершуєм роботу з ним
Якщо інформацію отримано продовжуєм роботу з ним
Заповнюєм потрібну інформацію
int FindFreeBlock(HANDLE VolumeHandle,ULONG64 MinimumLcn,DWORD MinimumSize,ULONG64 *BeginLcn,ULONG64 *EndLcn);
За допомогою функції DeviceIoControl з FSCTL_GET_VOLUME_BITMAP отримуєм карту диску
Якщо карту диску не отримано завершуєм роботу з ним
Якщо карту диску отримано продовжуєм роботу з ним
Перебираються кластери для пошуку блоку розміру, який задано
3.3. Алгоритм роботи утиліти
Загальна схема алгоритму роботи відображена в Додатку 2. Нижче наведені пояснення щодо кожного блоку схеми (номер пункту відповідає номеру блоку на блок-схемі).
Початок
Початкова ініціалізація утиліти. Входження в функцію main()
Вивід списку логічних дисків
Виклик функції GetLetters.Перевірка чи знайдено хоча б один логічний диск:
Виведення тексу проте, що не знайдено жодного розділу.
Виведення інформації про логічні диски і повідомлення про введення символу диску.
Введення символу
Користувач вводить символ:
Символ відповідає букві логічного диску, перехід до п. 4.
Символ відповідає клавіші «Enter», перехід до п. 12.
Сканування логічного диску
Відбувається рекурсивний обхід всіх файлів і директорій логічного диску викликом функцій Dir і GetFiles і для кожного викликає GetClusters
Виведення результату сканування
Виводиться інформація про те, скільки файлів і директорій було про скановано і скільки з них є фрагментованими
Введення символу
Користувач вводить символ:
Якщо символ відповідає клавіші «Enter» або фрагментованих файлів не знайдено, перейти до п. 2.
Якщо символ відповідає клавіші “L”, перейти до п. 8.
Якщо символ відповідає клавіші “D” перейти до п. 7.
Дефрагментація
Виклик функції Defrag, яка відправляє на де фрагментацію всі знайдені фрагментовані файли і директорії.
Виведення фрагментованих файлів
Виводить всі файли і директорії, які потребують дефрагментації.
Виведення процесу переміщення кластерів
В процесі виконання дефрагментації виводиться інформація про те, який файл чи директорія задіяні і інформація які сектори на даний час переміщаються.
Введення символу
Користувач вводить будь-який символ, перехід до п. 6.
Введення символу
Користувач вводить будь-який символ, перехід до п. 2.
Кінець
Завершення виконання
4. Інструкція користувача та результати тестування
4.1. Інструкція користувача.
4.1.1. Установка і запуск
Утиліта не потребує установки для запуску.
Утиліта вимагає прав адміністратора для виконання.
До складу Утиліти входить сам виконавчий модуль: Defrag.exe
Утиліта орієнтована на сімейство операційних систем Windows. Оскільки програма використовує стандартні WinAPI функції, тому вона не потребує наявності додаткових бібліотек в системі.
4.1.2. Вікно утиліти
Утиліта не має графічного інтерфейсу і виконується у вікні командної стрічки.
Вікно утиліти після запуску (див. Рис. 4.1.). Відображаються всі логічні розділи на комп’ютері і 2 команди для пошуку фрагментованих файлів (з відображенням ходу виконання і без нього).
/
Рис 4.1. Вигляд вікна утиліти після запуску
Для того щоб вибрати диск для пошуку фрагментованих файлів потрібно натиснути клавішу з літерою (в англійській розкладці) для вибору диску (див. Рис. 4.2.) або . клавішу з літерою (в англійській розкладці) + Shift для вибору диску (без відображення проходження процесу сканування) (див. Рис. 4.3.).
/
Рис 4.2. Процес сканування з відображенням
/
Рис 4.3. Процес сканування без відображення
Після сканування виводиться повідомлення про його результати.
Знайдено фрагментовані файли і директорії (див. Рис. 4.4.)
Якщо натиснути клавішу L буде відображено список фагментованих файлів і директорій (див. Рис. 4.6.)
Якщо натиснути клавішу D почнеться дефрагментація (для кожного файлу і директорії відображується які кластери переміщаються або повідомлення про те, що не знайдено місця для переміщення файлу) (див. Рис. 4.7.)
Фрагментованих файлів і директорій не знайдено (див. Рис. 4.5.)
/
Рис 4.4. Знайдено фрагментовані файли і директорії
/
Рис 4.5. Фрагментованих файлів і директорій не знайдено
/
Рис 4.6. Список фрагментованих файлів і директорій
/
Рис 4.7. Процес дефрагментації
Для того, щоб повернутись до стартового потрібно натиснути клавішу ентер (якщо не проводиться якась операція).
4.2. Результати тестування
Для тестування проводилась дефрагментація диску F
/
Рис. 4.8. Диск до дефрагментації (Auslogics Disk Defrag)
/
Рис. 4.9. Результати сканування
/
Рис. 4.10. Процес дефрагментації
/
Рис. 4.11. Диск після дефрагментації (Auslogics Disk Defrag)
Висновок
В процесі виконання курсової роботи було розроблено утиліту для дефрагментації логічних розділів жорсткого диску.
Утиліта має такий функціонал:
Пошук логічних дисків
Пошук фрагментованих файлів та директорій
Відображення списку фрагментованих файлів та директорій
Дефрагментація фрагментованих файлів та директорій з відображенням процесу дефрагментації
Утиліта працює в операційних системах сімейства Windows. Розроблена утиліта може використовуватись для дефрагментації, але вона розроблена більше у навчальних і ознайомчих цілях оскільки її функціонал є набагато меншим ніж в інших програм, які виконують аналогічні функції.
У майбутньому можливе розширення функціоналу програми, а саме:
Використання графічного інтерфейсу
Можливість дефрагментації з сортуванням
Можливість переміщення файлів для створення великого вільного неперервного блоку
Спискок літератури
Джонсон М. Харт, Системное программирование в среде Windows. – М.: Издательский дом «Вильямс», 2005. – 592 с.
Ричард Дж. Саймон, Microsoft Windows 2000 API. Энциклопедия программиста– ДиаСофтЮп, 2002. – 1086 с.
Рихтер Дж., Windows для профессионалов: сохдание эффективных win32-приложений с учетом специфики 64-разрядной версии Windows. – СПб.: Питер, 2008. –720с.
Фрагментація і дефрагментація http://uk.wikipedia.org/wiki/Фрагментація_і_дефрагментація
Дефрагментаторы http://programy.com.ua/ru/defragmenters/
Inside Windows NT Disk Defragmenting
http://www.windowsitpro.com/article/internals-and-architecture/inside-windows-nt-disk-defragmenting
Додаток 2. Блок-схема алгоритму
Додаток 3. Код програми
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<Windows.h>
#include<conio.h>
#include<iostream>
#include <list>
#include<locale>
#include <string>
using namespace std;
list<char> GetLetters();
void Search(char let);
void Dir(char *root);
void GetFiles(char* way);
int GetClusters(const char* name,bool d);
void ProcessVolume(HANDLE VolumeName);
int FindFreeBlock(HANDLE VolumeHandle,ULONG64 MinimumLcn,DWORD MinimumSize,ULONG64 *BeginLcn,ULONG64 *EndLcn);
int Defrag();
int files=0;
bool sh=true;
DWORD ClusterSize;
list<string> frag_files;
ULONG64 MaxLcn;
struct {
ULONG64 Start;
ULONG64 End