РАЗРАБОТКА СИСТЕМНОЙ УТИЛИТЫ ДЕФРАГМЕНТАЦИИ ЛОГИЧЕСКОГО ДИСКА - Студенческий научный форум

VIII Международная студенческая научная конференция Студенческий научный форум - 2016

РАЗРАБОТКА СИСТЕМНОЙ УТИЛИТЫ ДЕФРАГМЕНТАЦИИ ЛОГИЧЕСКОГО ДИСКА

Алексеев Д.М. 1, Пескова О.Ю. 1
1Южный Федеральный Университет
 Комментарии
Текст работы размещён без изображений и формул.
Полная версия работы доступна во вкладке "Файлы работы" в формате PDF

Введение

 

Отличительным признаком современного мира является глобальная компьютеризация, компьютер стал неотъемлемой частью любой сферы деятельности человека. Каждый из нас сталкивается с компьютерными технологиями ежедневно (когда платим за услуги ЖКХ, покупаем еду в супермаркете, видим рекламные баннеры, работаем в сети Интернет). При этом мы даже не задумываемся о том, как работает это гениальное устройство.

Что же такое «компьютер»? Компьютер – это средство для передачи, хранения и обработки информации. Но как же это устройство осуществляет ее накопление? Как размещены и организованы файлы в современных компьютерах? Ответ на этот вопрос кроется в понятии файловая система.

Файловая система – это часть операционной системы, назначение которой состоит в том, чтобы обеспечить пользователю удобный интерфейс при работе с данными, хранящимися на диске, и обеспечить совместное использование файлов несколькими пользователями и процессами.[5, 6]

На компьютерах под управлением операционной системой Windows информация на запоминающих устройствах организована файловой системой NTFS. Одним из свойств данной файловой системы является так называемая фрагментация файлов. Она представляет собой процесс разбиения каждого файла на небольшие фрагменты при записи на диск.

По мере использования информации (добавление новой, удаление или перемещение старой) разные блоки одного файла физически могут оказаться записанными не подряд. В результате, считывающее устройство тратит большее количество времени на поиск и чтение блоков одного файла, что приводит к увеличению времени чтения. [4]

Решение данной проблемы заключается в выполнении дефрагментации.

Дефрагментация – процесс обновления и оптимизации логической структуры раздела диска с целью обеспечения хранения файлов в непрерывной последовательности кластеров. После дефрагментации ускоряется чтение и запись файлов, а, следовательно, и работа программ. [4]

Процесс выполнения дефрагментации логического диска можно реализовать как вручную, так и программно, запустив необходимый скрипт.

Целью моей работы является создание в среде разработки JetBrains PyCharm Community Edition 3.4.1 приложения (системной утилиты), выполняющей дефрагментацию логических дисков. Разработанная программа должна иметь следующий функционал и выполнять такие задачи, как:

1.      Сбор информации о доступных разделах, их состоянии, сохранение информации в файле

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

3.      Выполнение анализа выбранного раздела на предмет необходимости выполнения дефрагментации

4.      Сохранение отчета по проведенному анализу в файл, имя которого определяется временем и датой выполнения анализа

5.      Вывод на рабочую область экрана содержания отчета

6.      Выполнение дефрагментации выбранного раздела

7.      Сохранение отчета о деталях проведенной дефрагментации в файл, имя которого определяется временем и датой выполнения дефрагментации

8.      Вывод на рабочую область экрана содержания отчета

В ходе достижения поставленной цели мною будут рассмотрены следующие основные пункты:

1.      Теоретические основы

2.      Основные модули программы

3.      Руководство программиста

4.      Руководство пользователя

 

1.1. Файловая система

Файловая система - это часть операционной системы, назначение которой состоит в том, чтобы обеспечить пользователю удобный интерфейс при работе с данными, хранящимися на диске, и обеспечить совместное использование файлов несколькими пользователями и процессами. В широком смысле понятие "файловая система" включает:

- совокупность всех файлов на диске,

- наборы структур данных, используемых для управления файлами, такие, например, как каталоги файлов, дескрипторы файлов, таблицы распределения свободного и занятого пространства на диске,

- комплекс системных программных средств, реализующих управление файлами, в частности: создание, уничтожение, чтение, запись, именование, поиск и другие операции над файлами. [5, 6, 7]

Файлы идентифицируются именами. Пользователи дают файлам символьные имена, при этом учитываются ограничения ОС как на используемые символы, так и на длину имени. До недавнего времени эти границы были весьма узкими. Так в популярной файловой системе FAT длина имен ограничивается известной схемой 8.3 (8 символов - собственно имя, 3 символа - расширение имени), а в ОС UNIX System V имя не может содержать более 14 символов. Однако пользователю гораздо удобнее работать с длинными именами, поскольку они позволяют дать файлу действительно мнемоническое название, по которому даже через достаточно большой промежуток времени можно будет вспомнить, что содержит этот файл. Поэтому современные файловые системы, как правило, поддерживают длинные символьные имена файлов. Например, Windows NT в своей новой файловой системе NTFS устанавливает, что имя файла может содержать до 255 символов, не считая завершающего нулевого символа.[7]

При переходе к длинным именам возникает проблема совместимости с ранее созданными приложениями, использующими короткие имена. Чтобы приложения могли обращаться к файлам в соответствии с принятыми ранее соглашениями, файловая система должна уметь предоставлять эквивалентные короткие имена (псевдонимы) файлам, имеющим длинные имена. Таким образом, одной из важных задач становится проблема генерации соответствующих коротких имен.

Длинные имена поддерживаются не только новыми файловыми системами, но и новыми версиями хорошо известных файловых систем. Например, в ОС Windows 95 используется файловая система VFAT, представляющая собой существенно измененный вариант FAT. Среди многих других усовершенствований одним из главных достоинств VFAT является поддержка длинных имен. Кроме проблемы генерации эквивалентных коротких имен, при реализации нового варианта FAT важной задачей была задача хранения длинных имен при условии, что принципиально метод хранения и структура данных на диске не должны были измениться.[5, 7]

Обычно разные файлы могут иметь одинаковые символьные имена. В этом случае файл однозначно идентифицируется так называемым составным именем, представляющем собой последовательность символьных имен каталогов. В некоторых системах одному и тому же файлу не может быть дано несколько разных имен, а в других такое ограничение отсутствует. В последнем случае операционная система присваивает файлу дополнительно уникальное имя, так, чтобы можно было установить взаимно-однозначное соответствие между файлом и его уникальным именем. Уникальное имя представляет собой числовой идентификатор и используется программами операционной системы. Примером такого уникального имени файла является номер индексного дескриптора в системе UNIX.

Файлы бывают разных типов: обычные файлы, специальные файлы, файлы-каталоги.

Обычные файлы в свою очередь подразделяются на текстовые и двоичные. Текстовые файлы состоят из строк символов, представленных в ASCII-коде. Это могут быть документы, исходные тексты программ и т.п. Текстовые файлы можно прочитать на экране и распечатать на принтере. Двоичные файлы не используют ASCII-коды, они часто имеют сложную внутреннюю структуру, например, объектный код программы или архивный файл. Все операционные системы должны уметь распознавать хотя бы один тип файлов - их собственные исполняемые файлы.

Специальные файлы - это файлы, ассоциированные с устройствами ввода-вывода, которые позволяют пользователю выполнять операции ввода-вывода, используя обычные команды записи в файл или чтения из файла. Эти команды обрабатываются вначале программами файловой системы, а затем на некотором этапе выполнения запроса преобразуются ОС в команды управления соответствующим устройством. Специальные файлы, так же как и устройства ввода-вывода, делятся на блок-ориентированные и байт-ориентированные.

Каталог - это, с одной стороны, группа файлов, объединенных пользователем исходя из некоторых соображений (например, файлы, содержащие программы игр, или файлы, составляющие один программный пакет), а, с другой стороны, - это файл, содержащий системную информацию о группе файлов, его составляющих. В каталоге содержится список файлов, входящих в него, и устанавливается соответствие между файлами и их характеристиками (атрибутами).

В разных файловых системах могут использоваться в качестве атрибутов разные характеристики, например:

-          информация о разрешенном доступе,

-          пароль для доступа к файлу,

-          владелец файла,

-          создатель файла,

-          признак "только для чтения",

-          признак "скрытый файл",

-          признак "системный файл",

-          признак "архивный файл",

-          признак "двоичный/символьный",

-          признак "временный" (удалить после завершения процесса),

-          признак блокировки,

-          длина записи,

-          указатель на ключевое поле в записи,

-          длина ключа,

-          времена создания, последнего доступа и последнего изменения,

-          текущий размер файла,

-          максимальный размер файла.

Каталоги могут непосредственно содержать значения характеристик файлов, как это сделано в файловой системе MS-DOS, или ссылаться на таблицы, содержащие эти характеристики, как это реализовано в ОС UNIX (рис. 1.1). Каталоги могут образовывать иерархическую структуру за счет того, что каталог более низкого уровня может входить в каталог более высокого уровня (рис. 1.2). [8]

Иерархия каталогов может быть деревом или сетью. Каталоги образуют дерево, если файлу разрешено входить только в один каталог, и сеть - если файл может входить сразу в несколько каталогов. В MS-DOS каталоги образуют древовидную структуру, а в UNIX'е - сетевую. Как и любой другой файл, каталог имеет символьное имя и однозначно идентифицируется составным именем, содержащим цепочку символьных имен всех каталогов, через которые проходит путь от корня до данного каталога.

 

 

Рис. 1.1.  Структура каталогов: а - структура записи каталога MS-DOS (32 байта); 
б - структура записи каталога ОС UNIX.

 

 

Рис. 1.2. Логическая организация файловой системы: а - одноуровневая; б - иерархическая (дерево); в - иерархическая (сеть).

 

1.2. NTFS

NTFS - предпочитаемая файловая система в семействе Windows 2003 Server, Windows XP, Windows 2000 и Windows NT. Она была разработана, чтобы удовлетворять требованиям быстродействующих файловых и сетевых серверов, а так же персональных ЭВМ и, при этом, обойти многие из ограничений, ранее сделанных в файловых системах FAT16 и FAT32. Наиболее важными из этих требований следуют ниже:

-          Восстанавливаемость данных. NTFS ограничивает возможность порчи данных, организовывая операции ввода-вывода (I/O) при помощи транзакций (групповых операций). Транзакции являются элементарными операциями, который означают, что или вся операция ввода-вывода (I/O) должна завершиться, или ни одно из этих действий не может завершиться. Если что-нибудь прерывает транзакцию, происходящую из-за потери электропитания компьютера или отмены операции ввода-вывода (I/O), NTFS делает все возможное, чтобы гарантировать, что любое изменение, сделанное в файловой системе (поскольку часть операции ввода-вывода (I/O) была отменена или был сделан откат назад), возвращает файловую систему в ее прежнее состояние, перед тем как операция ввода-вывода (I/O) началась.

-          NTFS является также и полностью восстанавливаемой файловой системой. Она предназначена, чтобы восстанавливать последовательность данных на диске после сбоя центрального процессора, системного аварийного отказа или ошибки ввода - вывода (I/O). NTFS дает возможность операционной системе, чтобы восстановиться без использования вами утилит проверки диска. Однако NTFS обеспечивают некоторые дисковые утилиты в случае, если восстановление завершается ошибкой, или искажение данных  происходит за пределами управления файловой системы.

-          Сохранение устойчивости при сбоях. Методы хранения избыточных данных могут использоваться NTFS, чтобы гарантировать, что, если данные разрушаются на одном физическом диске, то может извлечься сохраненная копия из зеркала диска. NTFS всегда использует избыточность данных, чтобы защитить внутренние структуры данных, содержащие метаданные, очень важные для целостности тома.

-          Защита данных. NTFS выполняет файлы и каталоги как защищенные объекты согласно архитектуре защиты (системы безопасности) объекта Windows. Доступ к объектам файла и каталога в NTFS может быть ограничен конкретным пользователям и их группам в среде этой архитектуры. Функции защиты данных для файлов и каталогов не включаются в файловых системах FAT. [3]

Другие улучшенные функции, обеспечиваемые NTFS - перечислены ниже:

-          Многочисленные потоки данных. NTFS файлы могут состоять из более, чем одного потока. Дополнительные потоки могут содержать любой вид данных, хотя обычно это - данные, характеризующие файл или метаданные.

-          Имена в UnicodeUnicode - стандартный символьный набор, используемый в NTFS. Он заменяет устаревший однобайтовый символьный набор ASCII. Каждый символ, используемый в каждом главном естественном языке, представлен уникальным двухбайтовым числом в символьном наборе Unicode

-          Усовершенствованная индексация атрибута файла. NTFS включает в себя способность индексировать атрибуты файла в качестве средства расположения и сортировки многочисленных файлов, которые быстро совместно используют похожие данные. В файловых системах FAT32 и FAT16 Вы можете  индексировать имена файлов, но не их атрибуты. Также, эти файловые системы не имеет функциональных возможностей, чтобы сортировать индексированные имена файлов FAT32 и FAT16.

-          Динамическое перераспределение плохих кластеров. Когда операция чтения на томе NTFS, который не защищен от ошибок, встречает испорченные данные в группе секторов, каждый сектор в группе (кластере), отмечается как плохой, и последующие попытки выполнить операции чтения в этом секторе приведут к возвращению ошибки. В том же самом сценарии в файловых системах FAT, сама файловая система не отмечает дефектные секторы - пользователь должен запустить утилиту Chkdsk.exe, чтобы сделать это.

-          Жесткие связи и подсоединения. Жесткие связи и подсоединения - это два способа, которыми объекты-хранилища могут быть связаны в среде NTFS.

-          Поддержка сжатия и разреженного файла. Тома NTFS поддерживают сжатие файла на базе отдельного файла. Алгоритм сжатия файла, используемый NTFS - это метод сжатия Lempel-Ziv. Это - не имеющий потерь алгоритм сжатия, что означает, что данные, при сжатии и восстановлении из сжатого состояния файла, не теряются , в противоположность алгоритмам сжатия с потерями типа формата файла изображения JPEG, где некоторые данные теряются каждый раз, когда происходят сжатие и восстановление сжатых данных.

-          Системные журналы изменений. NTFS создает и поддерживает системные журналы изменений для каждого тома, которые отслеживают все изменения, сделанные в них.

-          Отслеживание распределенных связей. Оболочка Windows дает возможность пользователю создать файлы на её рабочем столе, связанные с приложениями, которые постоянно находятся в другом месте на томе. Меню Пуск, которое пользователь может конфигурировать, содержит много образцов этого вида связей. Также и технология связывания и внедрения объекта, или OLE, дает возможность прикладной программе внедрить связи от внешних файлов внутрь файлов, которые они создают и поддерживают. Составные части набора Office 2000: WordPowerPoint и Excel— являются примерами приложений, которые используют OLE технологию. Проблема возникает в предыдущих случаях тогда, когда файл, будучи связанным (источник связи) перемещается, что делает его недоступным через посредство связи также, называемый как клиент связи. Отслеживание распределенной связи было сначала введено в версии NTFS, поставляемую с Windows 2000, чтобы дать возможность клиентским приложениям проследить за источниками связи, которые переместились. В результате этого, приложения и пользователи, которые создают связи, не должны обслуживать редактирование связи самостоятельно, когда источник ссылки перемещается.

-          Шифрование. NTFS обеспечивает Шифрующую файловую систему, или (EFS) для криптографической защиты файлов и каталогов.

-         Поддержка POSIX. Ниже перечислены функциональные возможности POSIX, которые были введены в Windows 2000:

а) Файлы могут получить доступ в файловых системах NTFS в соответствии с соглашениями об именовании POSIX. Соглашения POSIX допускают имена файлов, которые имеют концевые пробелы, имена файла, которые имеют точки в конце и имена файла, которые являются идентичными, если не считать регистр символов.

б) Разрешаются пересечения, где атрибуты защиты каждого родительского каталога в пути файла или каталога используются в определении, имеет ли конкретный пользователь доступ к нему.

в)    Отметки времени "Файл изменил время".

г)    Жесткие ссылки в POSIX-стиле.

-          API дефрагментации. Файл сохраняется на дисководе и другом носителе информации в одном или нескольких кластерах. Кластеры - это элементарный модуль данных, составленных из одного или нескольких секторов. Сектора - это физические модули сохранения данных.

Поскольку файл записывается на диск, файл не может записаться в непрерывных кластерах. Кластеры, состоящие из нескольких несмежных участков, замедляют процесс чтения и записи файла. Удаленные друг от друга на диске кластеры, состоящие из нескольких несмежных участков, обрабатываются медленнее из-за увеличенного времени, которое тратиться для перемещения головок чтения/записи жесткого диска к ним. Файл с кластерами, состоящими из нескольких несмежных участков, как говорят -  фрагментирован. Чтобы оптимизировать файлы для быстрого доступа, том может дефрагментироваться.

-          Дефрагментация - это процесс перемещения кластеров файла на диске, который делает их непрерывными. NTFS не выполняет дефрагментацию, но с версией 5.0 это действие предоставляется для приложений, чтобы выполнять дефрагментацию при помощи вызова API.

-          Точки повторной обработки. В среде NTFS, файл или каталог могут содержать точку повторной обработки, которая является совокупностью определяемых пользователем данных.

-          Каталоги как точки повторной обработки тома. Точки повторной обработки тома - это каталоги в томе, которые приложение может использовать, чтобы "собрать" другой том, то есть установить его для использования в месте, которое задает пользователь. Другими словами, Вы можете использовать точку повторной обработки тома как шлюз к тому. Когда том установлен в точке повторной обработки тома, пользователи и приложения могут видеть монтируемый том с помощью точки повторной обработки тома или имени диска. Например, при помощи установленной точки монтирования тома, пользователь может видеть диск D как "C:\mnt\Ddrive" так же как "D:".

Используя точки повторной обработки тома, Вы можете объединить в одну логическую файловую систему в корне различные файловые системы такие как NTFS, 16-разрядная файловая система FAT, файловых система ISO-9660 для диска CD-ROM и так далее. Ни пользователи, ни приложения не нуждаются в информации о томе, на котором находится конкретный файл. Вся информация, которой они должны определить местонахождение заданного файла - полный путь к нему. Тома могут быть перестроены, заменены или разделены на многие тома без пользователей или приложений, которые должны изменить назначения. [3, 7]


1.3. Дефрагментация

Дефрагментация — процесс обновления и оптимизации логической структуры раздела диска с целью обеспечения хранения файлов в непрерывной последовательности кластеров. После дефрагментации ускоряется чтение и запись файлов, а следовательно и работа программ, ввиду того, что последовательные операции чтения и записи выполняются быстрее случайных обращений (например, для жесткого диска при этом не требуется перемещение головки). Другое определение дефрагментации: перераспределение файлов на диске, при котором они располагаются в непрерывных областях.[4]

Длинные файлы занимают несколько кластеров. Если запись производится на незаполненный диск, то кластеры, принадлежащие одному файлу, записываются подряд. Если диск переполнен, на нём может не быть цельной области, достаточной для размещения файла. Тем не менее, файл все-таки запишется, если на диске много мелких областей, суммарный размер которых достаточен для записи. В этом случае файл записывается в виде нескольких фрагментов.

Процесс разбиения файла на небольшие фрагменты при записи на диск называется фрагментацией. Если на диске много фрагментированных файлов, скорость чтения носителя уменьшается, поскольку поиск кластеров, в которых хранятся файлы, на жёстких дисках требует времени. На флеш-памяти, например, время поиска не зависит от расположения секторов, и практически равно нулю, поэтому для них дефрагментация не требуется.

Некоторое ПО требует, чтобы определённые файлы в обязательном порядке хранились в последовательно расположенных секторах (например, встроенный эмулятор CD-ROM в приводе Zalman VE-200 предъявляет такое требование к файлам образов). Даже если в такой привод будет установлен твердотельный накопитель, очевидно, дефрагментация ему всё-таки понадобится.

Дефрагментация чаще всего используется для таких файловых систем, как File Allocation Table для MS-DOS и Microsoft Windows, так как в программах для работы с ними обычно не предусмотрено никаких средств для предотвращения фрагментации, и она появляется даже на почти пустом диске и небольшой нагрузке.[4]

Помимо замедления компьютера в работе с файловыми операциями (таких как чтение и запись), фрагментация файлов негативно сказывается на «здоровье» жёсткого диска, так как заставляет постоянно перемещаться позиционирующие головки диска, которые осуществляют чтение и запись данных. Для устранения проблемы фрагментации существуют программы - дефрагментаторы, принцип работы которых заключается в «сборе» каждого файла из его фрагментов. Общим недостатком таких программ является их медленная работа — процесс дефрагментации обычно занимает очень много времени (до нескольких часов).

Несмотря на то, что среди программ такого рода имеются довольно популярные и известные, хорошую дефрагментацию можно провести своими силами. Для этого достаточно создать на диске новый раздел с файловой системой, после чего просто скопировать на этот логический диск те файлы, которые на нём будут храниться. Во время такого копирования на пустой диск, запись данных осуществляется последовательно, без фрагментации. Кроме того, сам процесс записи файлов занимает в несколько раз меньше времени, чем дефрагментация с помощью программ.[4]

Знание файловой структуры и принципов работы жёсткого диска помогает сильно уменьшить фрагментацию файлов благодаря правильной организации работы пользователя. Эта организация заключается в том, что на чистый диск сначала записываются те файлы, которые предполагается хранить долго: любимые фильмы, архивы, музыку. Те же файлы, которые не планируется долго хранить, лучше записывать в конец диска: их удаление не вызовет дробления других файлов.[4, 8]

 

2. Руководство программиста

 

2.1. Общая информация

Программа дефрагментации логического диска «Defragmentation Utility» создана в среде разработки JetBrains PyCharm Community Edition 3.4.1 на языке программирования Python. Реализована данная программа в качестве консольного приложения.

 

2.2. Функционал и возможности программы

 

При разработке программы преследовались следующие цели:

-        Быстродействие. Процесс дефрагментации разделов диска может занимать от нескольких минут до нескольких часов, в зависимости от типа носителя, его объема и степени фрагментации файлов. Поэтому, для того, чтобы оптимизировать затраты времени при использовании программы, было решено использовать системные возможности ОС для дефрагментации, которые программа вызывает в ходе работы.

-        Возможность удаленного использования. Зачастую администраторам требуется провести дефрагментацию носителей нескольких клиентов, которые могут находиться на существенном отдалении. Для этого при разработке программы был использован язык программирования Python. Благодаря этому, скрипт-файлы программы можно поместить на сервере, затем, удаленно подключившись к нему, запустить программу, которая выведет всю необходимую информацию о проведении дефрагментации или анализа разделов носителей, а также укажет путь к лог-файлам. В связи с этим для данной программы был разработан консольный интерфейс.

-       Протоколирование результатов работы. Для того, чтобы можно было отследить историю дефрагментации разделов носителя на машине, программа была создана таким образом, чтобы она могла создавать лог-файлы с отметками даты и времени. Данная возможность поможет администратору или пользователю отследить, когда была запущена последний раз дефрагментация, сколько раз она запускалась вообще, а также просмотреть результаты всех действий.

Резюмируя все вышесказанное, можно заключить, что разработанная программа должна иметь следующий функционал и выполнять такие задачи, как:

1.      Сбор информации о доступных разделах, их состоянии, сохранение информации в файле

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

3.      Выполнение анализа выбранного раздела на предмет необходимости выполнения дефрагментации

4.      Сохранение отчета по проведенному анализу в файл, имя которого определяется временем и датой выполнения анализа

5.      Вывод на рабочую область экрана содержания отчета

6.      Выполнение дефрагментации выбранного раздела

7.      Сохранение отчета о деталях проведенной дефрагментации в файл, имя которого определяется временем и датой выполнения дефрагментации

8.      Вывод на рабочую область экрана содержания отчета

 

2.3. Модули программы

Программный код консольного приложения Defragmentation Utility можно условно  разделить на несколько логических структур (программных модулей):

1)      подключение используемых в программе стандартных библиотек (модулей) Python.

2)      создание заголовков для консольного приложения. В данной структуре реализован процесс вывода на рабочую область экрана названия программы, ее заголовков, а также списка найденных на данном компьютере разделов с краткой информацией о них. Работа данного программного модуля базируется на использовании операторов цикла (forin…), метода табуляции (\n - осуществляет переход на следующую строку), метода print (вывод текста на экран).

3)      получение списка найденных разделов с краткой информацией о них. В данной структуре реализован процесс получения списка найденных разделов, а также сведения об имени найденного раздела, его размере, типе, состоянии, типе файловой системы. Работа данного программного модуля базируется на использовании операторов цикла (forin…), методов list (осуществляет создание списка), system (осуществляет выполнение системной команды), open (открывает (при необходимости создает) файл для чтения), readlines (осуществляет построчное считывание данных из файла), find (выполняет поиск подстроки в строке), append (осуществляет добавление элемента в конец списка), метода конкатенации.

4)      выполнение анализа раздела, выбранного пользователем, на предмет необходимости выполнения дефрагментации данного раздела. В данной структуре реализован процесс выполнения анализа раздела на предмет необходимости выполнения дефрагментации данного раздела. Работа данного программного модуля базируется на использовании блока обработки исключений (tryexcept…), ключевых слов (логических переменных True and False), операторов цикла (forin…), операторов сравнения (if), методов list (осуществляет создание списка), system (осуществляет выполнение системной команды), append (осуществляет добавление элемента в конец списка), метода конкатенации, split (преобразует строку в список слов), join (объединяет список в строку с учетом заданного разделителя), а также метода конкатенации.

5)      выполнение дефрагментации раздела, выбранного пользователем. В данной структуре реализован процесс выполнения дефрагментации раздела, указанного пользователем. Работа данного программного модуля базируется на использовании блока обработки исключений (tryexcept…), ключевых слов (логических переменных True and False), операторов цикла (forin…), операторов сравнения (if), методов list (осуществляет создание списка), system (осуществляет выполнение системной команды), append (осуществляет добавление элемента в конец списка), метода конкатенации, split (преобразует строку в список слов), join (объединяет список в строку с учетом заданного разделителя), а также метода конкатенации.

6)      получение текущего времени. В данной структуре реализован процесс получения текущего времени и даты выполнения дефрагментации или анализа выбранного раздела.  Работа данного программного модуля базируется на использовании методов localtime (преобразует время, выраженное в секундах с начала эпохи в struct_time) и метода strftime (преобразует кортеж или struct_time в строку по указанному формату).

7)      блок работы с пользователем, вывод полученных данных на экран. В данной структуре реализован весь процесс взаимодействия с пользователем программы, осуществляется выбор им раздела диска, для которого необходимо провести анализ или фрагментацию, а также реализовано создание лог-файлов (отчетов по выполненной работе). Работа данного программного модуля базируется на использовании ключевых слов (логических переменных True and False), операторов цикла (forin…), операторов сравнения (if), методов system (осуществляет выполнение системной команды), open (открывает (при необходимости создает) файл для чтения), close (осуществляет закрытие файла), print (осуществляет вывод текстовой информации на экран), input (осуществляет получение данных, введенных пользователем с клавиатуры), а также метода конкатенации.  

 

3. Блок-схема работы программы 

 

Работа программы дефрагментации может быть представлена в виде блок-схемы (диаграмма действий языка UML), которая реализуется как последовательность действий, выполняемых пользователем, и ответов, которые он получает как результат взаимодействия с программой.

Открыв программу дефрагментации «Defragmentation Utility» (файл организации проектов PyCharm Community с расширением .py) в среде разработки PyCharm Community, пользователь осуществляет запуск окна консольного приложения.  Этот процесс реализован в блок-схеме как действие «Открыть файл .py».

В загруженном окне пользователю предлагается список доступных разделов, а также сведения об имени найденного раздела, его размере, типе, состоянии, типе файловой системы. Описание данного действия на языке UML выглядит как блок «Получение информации о разделах».

Далее программа предлагает пользователю ввести ключ. Возможны три варианта: A – анализ раздела, D – дефрагментация раздела, Exit – выход из программы, ее завершение. Описание данного действия на языке UML выглядит как блок «Ввод ключа».

Далее программа осуществляет проверку и обработку введенного пользователем ключа.  На первом этапе программа оценивает, желает ли пользователь выполнить анализ раздела на предмет необходимости выполнения дефрагментации. Описание данного действия на языке UML выглядит как блок условия «Ключ A?», выраженный в вопросной форме.

В зависимости от результата проверки условия («Да» или «Нет») осуществляется выбор одного из альтернативных путей работы алгоритма. Если пользователь желает выполнить анализ доступного раздела («Да»), программа предлагает ему выбрать один из доступных разделов. Данное действие на языке UML реализуется как прохождение блока «Выбор раздела».

Если имя раздела введено корректно, программа осуществляет анализ выбранного раздела на предмет необходимости дефрагментации. Описание данного действия на языке UML выглядит как блок «Анализ».

Далее программа предлагает пользователю вывести на экран отчет о деталях проведения анализа и его результатах. Описание данного действия на языке UML выглядит как блок условия «Печатать отчет?», выраженный в вопросной форме.

В зависимости от результата проверки условия («Да» или «Нет») осуществляется выбор одного из альтернативных путей работы алгоритма. Если пользователь решил вывести содержимое отчета на экран («Да»), программа отобразит на экране детали отчета. Данное действие на языке UML реализуется как прохождение блока «Вывод отчета на экран».

Если пользователь решил не выводить содержимое отчета на экран («Нет»), программа предложит пользователю вновь выбрать ключ. Данное действие на языке UML реализуется как повторное прохождение блока «Ввод ключа».

На втором этапе программа оценивает, желает ли пользователь выполнить дефрагментацию раздела. Описание данного действия на языке UML выглядит как блок условия «Ключ D?», выраженный в вопросной форме.

В зависимости от результата проверки условия («Да» или «Нет») осуществляется выбор одного из альтернативных путей работы алгоритма. Если пользователь желает выполнить дефрагментацию раздела («Да»), программа предлагает ему выбрать один из доступных разделов. Данное действие на языке UML реализуется как прохождение блока «Выбор раздела».

Если имя раздела введено корректно, программа осуществляет дефрагментацию выбранного раздела. Описание данного действия на языке UML выглядит как блок «Дефрагментация».

Далее программа предлагает пользователю вывести на экран отчет о деталях проведения дефрагментации и ее результатах. Описание данного действия на языке UML выглядит как блок условия «Печатать отчет?», выраженный в вопросной форме.

В зависимости от результата проверки условия («Да» или «Нет») осуществляется выбор одного из альтернативных путей работы алгоритма. Если пользователь решил вывести содержимое отчета на экран («Да»), программа отобразит на экране детали отчета. Данное действие на языке UML реализуется как прохождение блока «Вывод отчета на экран».

Если пользователь решил не выводить содержимое отчета на экран («Нет»), программа предложит пользователю вновь выбрать ключ. Данное действие на языке UML реализуется как повторное прохождение блока «Ввод ключа».

На третьем этапе программа оценивает, желает ли пользователь продолжить работу с программой. Описание данного действия на языке UML выглядит как блок условия «Ключ Exit?», выраженный в вопросной форме.

В зависимости от результата проверки условия («Да» или «Нет») осуществляется выбор одного из альтернативных путей работы алгоритма. Если пользователь желает продолжить работать с программой («Да»), программа предлагает ему выбрать ключ. Данное действие на языке UML реализуется как повторное прохождение блока «Ввод ключа».

Если пользователь не желает работать с программой, она закрывается. Описание данного действия на языке UML выглядит как блок «Конец». Работа программы, а, следовательно, и алгоритма, завершена.

Блок-схема работы программы дефрагментации представлена ниже (рис. 3.1).

 Рис. 3.1. Блок-схема программы.

 

4. Руководство пользователя 

 

4.1. Общая информация

Программа дефрагментации «Defragmentation Utility» создана в среде разработки PyCharm Community на языке программирования Python. Реализована данная программа в качестве консольного приложения. Для дальнейшего использования данного приложения необходимо открыть файл организации проектов PyCharm Community с расширением .py. Язык интерфейса программы – английский.

4.2. Руководство пользователя

 

Открыв программу дефрагментации «Defragmentation Utility»  (файл организации проектов PyCharm Community с расширением .py) в среде разработки PyCharm Community, пользователь осуществляет запуск окна консольного приложения. 

В дизайне загруженного окна наблюдается название консольного приложения, отображающее смысл работы программы - «Defragmentation Utility» («Утилита дефрагментации»). Здесь же пользователю предлагается список доступных разделов «Existing drives» («Доступные разделы») с краткой информацией о них, а также предложение ввести ключ. Возможны три варианта: A – анализ разделов («analyze drives») , D – дефрагментация разделов («defragment drives»), Exit – выход из программы («exit utility»)  (рис. 4.1).

 

Рис.4.1. Список доступных разделов и ввод ключа.

 

Далее программа осуществляет проверку и обработку введенного пользователем ключа.  Если пользователь решил провести анализ выбранного раздела на предмет необходимости выполнения дефрагментации, т.е. ввел ключ A, программа предложит ему выбрать разделы, для которых необходимо провести анализ – «Match drives by the comma» («Перечислите разделы, разделяя их запятой»). Также программой предусмотрена возможность проведения анализа для всех доступных разделов сразу. Для этого необходимо ввести в соответствующем поле ключ «ALL» («Все») (рис. 4.2).

 

Рис.4.2. Выбор раздела для анализа.

Далее, выбрав требующий анализа раздел, пользователю предлагаются детали и результат выполнения анализа раздела: «Starting analysis drives:» («Начало анализа диска:»), «Please, wait. It can take a few minutes.» («Пожалуйста, подождите. Это может занять несколько минут.»), «Analysis successful!» («Анализ проведен успешно!»).

Затем пользователю предлагается путь, где он может найти файл с отчетом о проведенном анализе – «Log file:» («Файл с отчетом: »). Также имеется возможность вывести содержимое файла – отчета на экран – «Print log file?» («Вывести на экран файл – отчет?») (рис. 4.3).

 

Рис.4.3. Детали проведения анализа.

Если пользователь решит вывести содержимое файла-отчета на экран, т.е. введет ключ «Y», программа отобразит подробные детали анализа и его результат (рис. 4.4).

 

Рис.4.4. Результат анализа выбранного раздела.

Затем пользователю предлагается нажать кнопку Enter для дальнейшей работы с программой.

Если пользователь решил провести дефрагментацию, т.е. ввел ключ D, программа предложит ему выбрать разделы, для которых ее необходимо провести – «Match drives by the comma» («Перечислите разделы, разделяя их запятой»). Также программой предусмотрена возможность проведения дефрагментации для всех доступных разделов сразу. Для этого необходимо ввести в соответствующем поле ключ «ALL» («Все») (рис. 4.5). 

Рис.4.5. Выбор раздела для дефрагментации.

Далее, выбрав требующий дефрагментации раздел, пользователю предлагаются детали и результат выполнения дефрагментации раздела: «Starting defragmentation drives:» («Начало дефрагментации диска:»), «Please, wait. It can take a few minutes.» («Пожалуйста, подождите. Это может занять несколько минут.»), «Defragmentation successful!» («Дефрагментация проведена успешно!»).

Затем пользователю предлагается путь, где он может найти файл с отчетом о проведенной дефрагментации – «Log file:» («Файл с отчетом: »). Также имеется возможность вывести содержимое файла – отчета на экран – «Print log file?» («Вывести на экран файл – отчет?») (рис. 4.6).

 

Рис.4.6. Детали проведения дефрагментации.

Если пользователь решит вывести содержимое файла-отчета на экран, т.е. введет ключ «Y», программа отобразит подробные детали дефрагментации и ее результат (рис. 4.7). 

Рис.4.7. Результат дефрагментации выбранного раздела.

Затем пользователю предлагается нажать кнопку Enter для дальнейшей работы с программой.

Также программа предусматривает возможность проверки корректности введенного ключа. Если параметр, введенный пользователем, будет некорректным, программа сообщит об ошибке – «Wrong parametr» («Неверный параметр»).

Если на этом пользователь решит окончить работу с программой, ему следует ввести ключ EXIT. В этом случае программа завершит свою работу.

            По завершении работы с программой пользователь закрывает консольное приложение.

            Программный код утилиты дефрагментации «Defragmentation Utility» находится в Приложении А.

 

Заключение

 

Век развития информационных технологий характеризуется рядом проблем, решение которых неразрывно связано с решением проблем быстродействия в компьютерных системах. В связи с этим, разработка утилиты дефрагментации – небольшой шаг вперед в этом направлении.

В ходе выполнения данной работы я изучил основы файловой системы, принципы, на которых она базируется, ее типы, основы дефрагментации, а также создал в среде разработки PyCharm Community утилиту анализа и дефрагментации  разделов жесткого диска. Разработанная программа имеет следующий функционал и способна выполнять такие задачи, как:

1.      Сбор информации о доступных разделах, их состоянии, сохранение информации в файле

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

3.      Выполнение анализа выбранного раздела на предмет необходимости выполнения дефрагментации

4.      Сохранение отчета по проведенному анализу в файл, имя которого определяется временем и датой выполнения анализа

5.      Вывод на рабочую область экрана содержания отчета

6.      Выполнение дефрагментации выбранного раздела

7.      Сохранение отчета о деталях проведенной дефрагментации в файл, имя которого определяется временем и датой выполнения дефрагментации

8.      Вывод на рабочую область экрана содержания отчета

Разработка программы позволила, таким образом, закрепить не только навыки в области теории дефрагментации, но также получить дополнительный опыт в сфере программирования. Этот опыт полезен тем, что работа велась в достаточно узкой сфере работы с командной строкой.

 

Список использованных источников

 

Книги

1.      Угринович Н.Д., «Информатика и ИКТ», Санкт-Петербург, 2006.

2.      Акулов О.А., «Информатика», Москва, 2007.

 

Электронные ресурсы

1.      Python 3 для начинающих [Электронный ресурс]: Модуль time – Режим доступа: http://pythonworld.ru/moduli/modul-time.html#

 

2.      Python [Электронный ресурс]: Strip, Split, Join - Режим доступа:  http://breys.ru/blog/521.html

 

3.      Файловая система NTFS [Электронный ресурс]: Режим доступа: http://www.ixbt.com/storage/ntfs.html

 

4.      Дефрагментация диска [Электронный ресурс]: Режим доступа: https://ru.wikipedia.org/wiki/Дефрагментация_диска

 

5.      Файловая система [Электронный ресурс]: Режим доступа: http://citforum.ru/operating_systems/sos/glava_10.shtml#

6.      Файловая система [Электронный ресурс]: Информационный центр - Режим доступа: https://ru.wikipedia.org/wiki/%D4%E0%E9%EB%EE%E2%E0%FF_%F1%E8%F1%F2%E5%EC%E0

7.      Файловые системы [Электронный ресурс]:  Режим доступа: http://www.bestreferat.ru/referat-219465.html

 

8.      Логическая структура дисков [Электронный ресурс]: Режим доступа: http://5fan.ru/wievjob.php?id=39798

 

 

ПРИЛОЖЕНИЕ А

 

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

# -*- coding: utf-8 -*-

 

import os

import time

import sys

 

 

def console_header(drives):

    print("==== Defragmentation Utility ====\n\n" \

          "Existing drives:\n")

    print("  Том      Имя    Метка      ФС     Тип          Размер  Состояние  Сведения\n"\

          "  -----    ----  ---------   ----  --------      ------  ---------  --------")

    for item in drives:

        print(item)

    print("  ---------------------------------------------------------------------------")

 

 

def get_drives_letters():

    diskpart_file = "C:\drive_info.txt"

    drives = list()

 

    os.system("chcp 65001 >> localhost")    # использование в командной строке кодировки UTF-8

    os.system("echo list volume|diskpart >>" + diskpart_file)    # запись в файл списка дисковых устройств

 

    for string in open(diskpart_file, "r", encoding='utf8').readlines():

        if string.find("Том") != -1:

            if string.find("NTFS") != -1 or string.find("FAT32") != -1:

                drives.append(string)

 

    os.system("del "+diskpart_file)

    return drives

 

 

def drives_analyzer(drive, drives):

    letters = list()

    drive_list = drive.split(", ")

    for item in drives:

        letters.append(item[15]+":")

    if drive_list[0] != "ALL":

        try:

            filename = "C:\ANALYSIS_" + timestamp() + ".log"

            os.system("chcp 65001 >> localhost")

            error = os.system("defrag.exe " + " ".join(drive_list) + " /A >> " + filename)

            if error == 0:

                return filename

            else:

                return False

        except:

            return False

    elif drive_list[0] == "ALL":

        try:

            filename = "C:\ANALYSIS_" + timestamp() + ".log"

            os.system("chcp 65001 >> localhost")

            error = os.system("defrag.exe " + " ".join(letters) + " /A >> " + filename)

            if error == 0:

                return filename

            else:

                return False

        except:

            return False

    else:

        return False

 

 

def drives_defrager(drive, drives):

    letters = list()

    drive_list = drive.split(", ")

    for item in drives:

        letters.append(item[15]+":")

    if drive_list[0] != "ALL":

        try:

            filename = "C:\DEFRAG_" + timestamp() + ".log"

            os.system("chcp 65001 >> localhost")

            os.system("defrag.exe " + " ".join(drive_list) + " /V >> " + filename)

            return filename

        except:

            return False

    elif drive_list[0] == "ALL":

        try:

            filename = "C:\DEFRAG_" + timestamp() + ".log"

            os.system("chcp 65001 >> localhost")

            os.system("defrag.exe /C /V >> " + filename)

            return filename

        except:

            return False

    else:

        return False

 

 

def timestamp():

    return time.strftime("%d_%m_%Y[%H-%M-%S]", time.localtime())

 

 

if __name__ == "__main__":

    drives = get_drives_letters()

    while True:

        os.system("cls")

        console_header(drives)

        key = input("A - analyze drives\n"

                        "D - defragment drives\n"

                        "EXIT - exit utility\n"

                        ">>> ")

        if key == "A":

            os.system("cls")

            console_header(drives)

            drive = input("Match drives by the comma.\n"

                              "Example: C:, D:\n"

                              "(ALL - for all drives): ")

            os.system("cls")

            print("Starting analysis drives: " + drive)

            print("Please, wait. It can take few minutes...")

            result = drives_analyzer(drive, drives)

            if result:

                os.system("cls")

                print("Analysis successful!\n" \

                     "Log file: " + result)

                print_key = input("Print log file? [y/n]")

                if print_key == "y":

                    f = open(result, "r", encoding='utf8')

                    os.system("cls")

                    print(f.read())

                    f.close()

                    input("Press [ENTER] to continue...")

 

            else:

                os.system("cls")

                print("Error occurred while analysis!")

                input("Press [ENTER] to continue...")

 

        elif key == "D":

            os.system("cls")

            console_header(drives)

            drive = input("Match name of drives by the comma.\n"

                              "Example: C:, D:\n"

                              "(ALL - for all drives): ")

            os.system("cls")

            print("Starting defragmentation drives: " + drive)

            print("Please, wait. It can take a few minutes...")

            result = drives_defrager(drive, drives)

            if result:

                os.system("cls")

                print("Defragmentation successful!\n" \

                     "Log file: " + result )

                print_key = input("Print log file? [y/n]")

                if print_key == "y":

                    f = open(result, "r", encoding='utf8')

                    os.system("cls")

                    print(f.read())

                    f.close()

                    input("Press [ENTER] to continue...")

            else:

                os.system("cls")

                print("Error occurred while defragmentation!")

                input("Press [ENTER] to continue...")

        elif key == "EXIT":

            os.system("cls")

            os.system("del C:\Course\Defrag_test1\localhost")

            sys.exit(0)

        else:

            os.system("cls")

            console_header(drives)

            print("Wrong parameter!")

            input("Press [ENTER] to continue...")

Просмотров работы: 936