public void DefragFile(string path, TextWriter log) { log.WriteLine("Looking at: " + path); if (!(new FileInfo(path).Exists)) { log.WriteLine("File no longer exists"); return; } FileLayout layout = new FileLayout(fileSystem.GetFileMap(path)); if (free_space_map == null) { log.WriteLine("Updating free space map"); UpdateFreeSpaceMap(); } try { DefragFile(path, layout, log); } catch (Exception) { free_space_map = null; throw; } }
private void DefragFile(string path, FileLayout layout, TextWriter log) { if (layout.Fragments() <= 1) { log.WriteLine("Skipped, does not require defrag."); return; } uint file_length = layout.Length(); ulong free_space_position = free_space_map.FindFreeSpan(file_length); if (free_space_position == UInt64.MaxValue) { log.WriteLine("Skipped, could not find a big enough span of free space."); return; } fileSystem.MoveFile(path, 0, free_space_position, file_length); free_space_map.Allocate(free_space_position, file_length); log.WriteLine("Defrag successfull."); }