Использование такого метода позволит быстро и удобно выполнять дефрагментацию часто фрагментированных файлов. Пользователь может указать необходимые для дефрагментации файлы, что позволит не затрагивать остальные файлы.
2.3 Среда разработки
2.3.1 С++ Bilder
Пятая версия продукта Borland C++ Builder , вышедшая в начале 2000 года, является достаточно популярной визуальной средой разработки на С++ для Windows. В состав среды входит множество различных компонентов и библиотек. Среда разработки имеет удобный редактор форм. Это позволяет создавать визуальные приложения с интерфейсами любой сложности. Редактор кода достаточно прост, но при написании большого кода программы навигация становится более трудной. К сожалению компилятор и отладчик в Bilder на выполнены на достаточном уровне. Откомпилированная программа занимает, относительно, много пространства на диске, и скорость работы приложения не максимальна. Язык программирования для данной среды является Object Pascal, но так же допускается использование в коде языка С. Такая мультиязычность кода приводит к потеряв быстродействия программы и усложнением работы над проектом.
2.3.2 MicrosoftVisualStudio
Является универсальной средой разработки. Включаетвсебя Visual Basic .NET (Visual Basic), Visual C++,Visual C#. Имеет различные редакции, одна из которых бесплатна, в некоторые входят также Microsoft SQL Server либо Microsoft SQL Server Express. Среда разработки имеет хороший и удобный редактор кода. Для облегчения работы программиста код подсвечен разными цветами, на каждую стандартную функцию можно получить справку. Однако количество доступных компонентов намного меньше чем для С++ Bilder5.0. Существует большая библиотека справочной информации Microsoft Developer Network (MSDN), что значительно помогает при изучении языка и создании приложений. Компилятор в VisualStudio создает приложения достаточно малого размера и скорость выполнения в связке с языком С++ предельно высокая.
2.3.3 Выбранная среда
Для написания программы был выбран язык программирования высокого уровня C++. Язык является C подобным, имеет небольшие отличия, которые значительно улучшают качество кода. Этот язык имеет множество библиотек, большое количество готовых функций, имеет множество возможностей, написание кода занимает значительно меньше времени, в сравнении с другими языками. Однако разработка приложения может занять более длительное время, нежели при использовании других языков. В виду сложности языка на его изучение требуется, относительно, много времени.
В качестве среды разработки была выбрана Microsoft Visual Studio 2005. Данная среда разработки является универсальной, так, как она поддерживает несколько языков программирования. В VS2005 встроен достаточно хороший компилятор, имеет удобный редактор кода и редактор графического интерфейса, обладает хорошим отладчиком.
РАЗДЕЛ 3. РУКОВОДСТВО ПРОГРАММИСТА
3.1 Стандартные функции
В многозадачных операционных системах, некоторые процессы могут считывать и записывать данные на жесткий диск в то время, когда другой процесс выполняет дефрагментацию. Необходимо избежать записи в файл который будет дефрагментироваться, не приостанавливая процесс записи на длительное время.
Чтобы проводить дефрагментацию, не требуя детальных сведений о структуре файловой системе, предусмотрены три основные управляющие коды. Они дают возможность приложению находить пустые кластеры на диске, определять положение кластеров файла и перемещать их. Они также позволяют и запрещают запись и чтение файла другим процессам.
Две из операций, используемых в процессе дефрагментации требуют дескриптора тома. Только администраторы могут получить дескриптор тома, так что только администраторы могут дефрагментировать том.
3.1.1 Управляющийкод FSCTL_GET_VOLUME_BITMAP
Данный код используется для нахождения необходимого пространства, в которое будет перемещен файл. В этой области должно быть достаточно свободных кластеров для перемещения заданного файла, в случае нехватки объема – эта область не используется и происходит поиск подходящей.
Для использования этой операции необходимо вызвать функцию DeviceIoControl
Возвращаемые значения. Если операция завершена успешно, DeviceIoControl возвращает ненулевое значение.
Если операция не может выполниться или еще выполняется, DeviceIoControl возвращает ноль (0). Для получения расширенной информации об ошибке, вызовите GetLastError.
Возвращенное значения от GetLastError из ERROR_MORE_DATA указывает для вызывающей функции о том, что буфер не был достаточно большим, чтобы разместить полный битовую карту с запрашиваемого начала LCN (logical cluster number – номер логического кластера) до последнего кластера на томе.
Возвращенное значения от GetLastError ERROR_NOT_READY указывает на то, что раздел является разделом с NTFS файловой системой и он не смонтирован.
3.1.2 Управляющийкод FSCTL_GET_RETRIEVAL_POINTERS
Данный код используется для получения расположения кластеров файла на диске. При вызове DeviceIoControl с этим кодом, InputBuffer должен содержать структуру STARTING_VCN_INPUT_BUFFER описывающую начальный элемент цепочки кластеров с которого мы хотим получить карту размещения файла, а после успешного выполнения функции OutputBuffer будет содержать структуру RETRIEVAL_POINTERS_BUFFER которая описывает карту размещения.
Для использования этой операции необходимо вызвать функцию DeviceIoControl.
3.1.3 Структура RETRIEVAL_POINTERS_BUFFER
Необходимо пройти по структуре возвращаемой FSCTL_GET_RETRIEVAL_POINTERS
Далее рассмотрим параметры входящие в структуру:
ExtentCount. Число элементов в массив.
StartingVcn. Начальный VCN возвращенный вызываемой функцией.
Это не обязательно VCN возвращенный вызываемой функцией, так как драйвер файловой системы может округлить первый VCN до области, которую запрашивал начальный VCN.
NextVcn. VCN на котором начинается следующая область. Это значение отнять либо StartingVcn, либо NextVcn предыдущего члена массива равно длине, в кластерах, текущей экстенте. Длинна является входным параметром для функции FSCTL_MOVE_FILE.
Lcn. VCN на котором начинается текущая экстента на томе. Эта переменная является входным параметров для FSCTL_MOVE_FILE. Для NTFS значение (LONGLONG) -1 указывает либо сжатие, либо нераспределенный регион рассеянных файлов.
3.1.4 Управляющий код FSCTL_MOVE_FILE
Используется для перемещения каждого кластера в последовательности обхода структуры. Перемещает виртуальные кластеры файла из одного логического кластера в другой, в пределах раздела. Если другой процесс что-то записывает на диск или в файл, необходимо обновить битовую карту и структуру. Если операция завершена успешно DeviceIoControl возвращает не нулевое значение. Нуль возвращается в случае ошибки выполнения, ее можно узнать, используя GetLastError. При ошибке перемещения некоторые кластеры все же могут быть перемещены, в таком случае необходимо обновить битовую карту и установить новые указатели.
3.1.5 Функция CreateFile
Функция CreateFile создает или открывает каталог, физический диск, том, буфер консоли (CONIN$ или CONOUT$), устройство на магнитной ленте, коммуникационный ресурс, почтовый слот или именованный канал. Функция возвращает дескриптор, который может быть использован для доступа к объекту.
Если функция завершается успешно, возвращаемое значение - открытый дескриптор заданного файла. Если заданный файл существовал до вызова функции, а параметр dwCreationDisposition установлен в CREATE_ALWAYS или OPEN_ALWAYS, вызов GetLastError возвращает значение ERROR_ALREADY_EXISTS (даже при том, что функция завершилась успешно). Если файл не существовал перед вызовом функции, функция GetLastError возвращает нуль.
Если функция завершается с ошибкой, возвращаемое значение - INVALID_HANDLE_VALUE. Чтобы получать дополнительные сведения об ошибке, вызовите GetLastError.
3.1.6 Функция CheckTokenMembership
Данная функция определяет, является ли определенный идентификатор безопасности, определителем доступа. Функция имеет три параметра: хендел токена, идентификатор безопасности, булево значение для вывода результата. С помощью данной функции можно определить обладает ли текущий пользователь правами администратора, что необходимо для выполнения дефрагментации файлов.
Функция IsUserAdmin выполняет проверку прав пользователя. Для этого необходимо получить идентификатор безопасности (SID) с помощью функции AllocateAndInitializeSid, с параметрами SECURITY_BUILTIN_DOMAIN_RID и DOMAIN_ALIAS_RID_ADMINS (отвечают за принадлежность к группе администраторов), которая инициализирует идентификатор. Далее, используя CheckTokenMembership, определяется права пользователя.
3.2 Функции, выполняющие дефрагментацию
Далее описана работа функций, которые реализованы в разработанной программе. Эти функции обеспечивают процесс дефрагментации.
3.2.1 Функция «file_map»
Функция получает битовую карту файла. Путь к файлу является входящим параметром FileName. В этой функции задействована стандартная функция DeviceIoControl с управляющим кодом FSCTL_GET_RETRIEVAL_POINTERS.
Для работы с файлом на начала следует его открыть используя функцию «CreateFile», с флагами чтения, записи, удаления, это необходимо для обеспечения полных прав на данный файл. Далее требуется определить размер кластера, что становится возможно после использования функции «GetDiskFreeSpace», входящим параметром является бува дска, выходными – количество секторов на кластер и количество байт на сектор, остальные параметры нам не потребуются. Следующим шагом является заполнения структуры. Для этого используется «DeviceIoControl». OutBuf описывает битовую карту файла, который следует дефрагментировать. Битовая карта используется в функции volume_map. Структура содержит количество фрагментов файла, значения VCN, LCN, порядок кластеров. Вся необходимая информация о файле, расположении его клавстеров на простраснтве диска, их порядок хранится в OutBuf. Результатом функции «file_map» является заполненный буфер.
3.2.2 Функция «volume_map»
Функция просматривает весь диск в поисках свободного пространства для размещения дефрагментируемого файла. Функция вычисляет количество кластеров на диске, рассчитывает и выделяет объем памяти для буфера.