1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace DiskAccessLibrary
- {
- public class DiskExtentsHelper
- {
-
- internal static List<DiskExtent> GetUnallocatedExtents(Disk disk, long dataRegionStartSector, long dataRegionSize, List<DiskExtent> usedExtents)
- {
- List<DiskExtent> result = new List<DiskExtent>();
- long startSector = dataRegionStartSector;
- SortExtentsByFirstSector(usedExtents);
-
- foreach (DiskExtent extent in usedExtents)
- {
- long extentStartSector = extent.FirstSector;
- long nextStartSector = extent.FirstSector + extent.Size / disk.BytesPerSector;
- long freeSpaceInBytes = (extentStartSector - startSector) * disk.BytesPerSector;
- if (freeSpaceInBytes > 0)
- {
- result.Add(new DiskExtent(disk, startSector, freeSpaceInBytes));
- }
- startSector = nextStartSector;
- }
-
- long spaceInBytes = dataRegionSize - (startSector - dataRegionStartSector) * disk.BytesPerSector;
- if (spaceInBytes > 0)
- {
- result.Add(new DiskExtent(disk, startSector, spaceInBytes));
- }
- return result;
- }
-
-
-
- public static void SortExtentsByFirstSector(List<DiskExtent> extents)
- {
- SortedList<long, DiskExtent> list = new SortedList<long, DiskExtent>();
- foreach (DiskExtent extent in extents)
- {
- list.Add(extent.FirstSector, extent);
- }
- extents.Clear();
- extents.AddRange(list.Values);
- }
- }
- }
|