Есть два варианта дефрагментации. Вы можете сделать это Easy Way, или вы можете сделать это Good Way:
Храните данные для перемещения и дефрагментации полностью в памяти. По сути, вы должны прочитать целые файлы, пока не освободите достаточно места, чтобы затем записать их обратно в непрерывный блок.
- плюс в том, что он будет быстрее и не требует дополнительного места на диске
Переместите данные в другое место на диске, затем переместите их назад, когда будет создан непрерывный блок, достаточно большой.
- этот путь намного медленнее, поскольку данные должны многократно считываться и записываться в другом месте.
Вариант 1 потенциально не требует дополнительного места на диске, но также потенциально опасен.
- Во время чтения и удаления файлов данные больше не существуют на диске. В случае отключения питания все файлы, которые были прочитаны, но не восстановлены на новом месте, будут потеряны, что может привести к катастрофическим последствиям.
- Вы не представляете, насколько большой буфер вам может понадобиться для чтения файлов. У вас могут быть файлы объемом в несколько гигабайт, которые нужно переместить, или много маленьких файлов. Требуется либо возможность выделять потенциально бесконечные объемы памяти (расширение файла подкачки и ухудшение фрагментации), либо использовать фиксированный процент памяти. Если у вас фиксированный размер буфера, вы можете загрузить (и обрезать) часть файла, чтобы освободить место, но в итоге вы окажетесь в худшем положении, поскольку у вас могут быть пропущенные части файлов в случае сбоя питания, который, возможно, будет хуже, чем пропустить весь файл.
Вариант 2 всегда гарантирует, что ваши данные находятся на диске, особенно если вы сначала копируете, а затем удаляете блоки.
Так что да, для безопасной дефрагментации без угрозы катастрофической потери данных вам нужно свободное место на диске.