示例#1
0
        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;
            }
        }
示例#2
0
 public IFreeSpace Allocate(ulong offset, ulong length)
 {
     if (top_node00 != null)
     {
         top_node00 = top_node00.Allocate(offset, length);
     }
     return this;
 }
示例#3
0
        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];
            }
        }
示例#4
0
 private void UpdateFreeSpaceMap()
 {
     BitArray bitmap = fileSystem.GetVolumeMap();
     free_space_map = new FreeSpaceTree(bitmap);
 }
示例#5
0
 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;
 }
示例#6
0
 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());
 }