Когда файл записывается на диск, он не может записаться в непрерывных кластерах. Кластеры состоящие из нескольких несмежных участков (несвязанные) замедляют процесс чтения и записи файла. Чем дальше друг от друга на диске кластеры состоящие из нескольких несвязанных участков, тем сильнее проблемы из-за времени, которое необходимо для перемещение головки чтения - записи накопителя на жестких дисках. Файл с кластерами состоящими из нескольких несвязанных участков, как говорят, будет фрагментирован (fragmented). Чтобы оптимизировать файлы для быстрого доступа, том может дефрагментироваться.
Дефрагментация (defragmentation) - это процесс перемещения частей файлов всюду по диску, чтобы дефрагментировать файлы; то есть процесс перемещения кластеров файла на диске, который делает их непрерывными.
В простой однозадачной операционной системе, дефрагментация является прямой: программа дефрагментации - единственная задача, и нет никаких других процессов, которые читают из или записывают на диск. Однако, в многозадачной операционной системе, некоторые процессы могут читать из и записывать в накопитель на жестких дисках в то время, когда другой процесс пытается дефрагментировать этот жесткий диск. Сложность заключается в том, чтобы избежать записей в файл, который будет дефрагментироваться, не останавливая процесс записи на очень долгий период. Решение этой проблемы не простое, но оно возможно.
Чтобы давать возможность проводить дефрагментацию, не требуя детальных сведений о структуре файловой системы на диске, предусматривается установка трех управляющих кодов. Они дают возможность прикладным программам определить местонахождение пустых кластеров, выяснить расположение на диске кластеров файла и переместить кластеры на диске. Они прозрачно обрабатывают проблему запрещения и разрешения другим процессам читать из и записывать в файлы в ходе их перемещения.
Эти операции могут выполняться, не запрещая другим процессам запускаться. Однако, остальные процессы будут иметь более долгое время отклика, в то время, когда диск дефрагментируется.
Чтобы дефрагментировать файл, используйте следующие шаги:
Две из операций, используемых в процессе дефрагментации требуют дескриптора тома. Только администраторы могут получить дескриптор тома, так что только администраторы могут дефрагментировать том. Ваша программа должна проверять привилегии пользователя, пытающегося запустить программу дефрагментации, и она не должна исполнять код, если пользователь не имеет соответствующих полномочий.
При использовании функции CreateFile, чтобы открыть каталог в ходе дефрагментации тома файловой системы FAT или FAT32, не устанавливайте значение маски доступа MAXIMUM_ALLOWED. В доступе к каталогу будет отказано, если это произойдет. Определите вместо него значение маски доступа GENERIC_READ.
Не пытайтесь перемещать кластеры назначенные файловой системой NTFS, которые дополняют кластер далее, до округленного размера файла. Если такая попытка делается, то она в результате приведет к сбойной ситуации.
Точки монтирования, битовые образы и перечни атрибутов в томах NTFS могут дефрагментироваться. Каждый из них может открываться для чтения и синхронизации и именоваться, используя синтаксис file:name:type; например, $i30:$INDEX_ALLOCATION, mrp:: $DATA, mrp:: $REPARSE_POINT и mrp:: $ATTRIBUTE_LIST.
При дефрагментации томов NTFS, дефрагментация виртуального кластера за пределами назначенного размера файла - разрешается.