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; } }
public IFreeSpace Allocate(ulong offset, ulong length) { if (top_node00 != null) { top_node00 = top_node00.Allocate(offset, length); } return this; }
public FreeSpaceTree(BitArray map) { List<IFreeSpace> nodes = new List<IFreeSpace>(); ulong free_space_span = 0; for (uint i = 0; i <= (uint)map.Length; i++) { if (i == (uint)map.Length || map.Get((int)i)) { if (free_space_span > 0) { nodes.Add(new Leaf(i - free_space_span, free_space_span)); } free_space_span = 0; } else { free_space_span++; } } while (nodes.Count > 1) { List<IFreeSpace> new_nodes = new List<IFreeSpace>(); List<IFreeSpace>.Enumerator enumerator = nodes.GetEnumerator(); while (enumerator.MoveNext()) { IFreeSpace left = enumerator.Current; if (enumerator.MoveNext()) { IFreeSpace right = enumerator.Current; new_nodes.Add(new Node(left, right)); } else { new_nodes.Add(left); } } nodes = new_nodes; } if (nodes.Count > 0) { top_node00 = nodes[0]; } }
private void UpdateFreeSpaceMap() { BitArray bitmap = fileSystem.GetVolumeMap(); free_space_map = new FreeSpaceTree(bitmap); }
public IFreeSpace Allocate(ulong offset, ulong length) { if (left_node.FindFreeSpan(1) < offset + length) { ulong right_node_offset = right_node.FindFreeSpan(1); if (right_node_offset > offset) { left_node = left_node.Allocate(offset, length); } if (right_node_offset < offset + length) { right_node = right_node.Allocate(offset, length); } if (left_node == null && right_node == null) { return null; } if (left_node == null) { return right_node; } if (right_node == null) { return right_node; } largest_free_span = Math.Max( left_node.LargestFreeSpan(), right_node.LargestFreeSpan()); } return this; }
public Node(IFreeSpace left, IFreeSpace right) { this.left_node = left; this.right_node = right; largest_free_span = Math.Max( left_node.LargestFreeSpan(), right_node.LargestFreeSpan()); }