private FileBackedDiskPack(DiskGeometry geometry, string path, bool load) { _packName = path; _geometry = geometry; if (load) { // // Attempt to open an existing stream for read/write access. // _diskStream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite); // // Quick sanity check that the disk image is the right size. // if (_diskStream.Length != geometry.GetDiskSizeBytes()) { _diskStream.Close(); _diskStream = null; throw new InvalidOperationException("Image size is invalid."); } } else { // // Attempt to initialize a new stream with read/write access. // _diskStream = new FileStream(path, FileMode.Create, FileAccess.ReadWrite); // // And set the size of the stream. // _diskStream.SetLength(geometry.GetDiskSizeBytes()); } }
public DiabloPack(DiabloDiskType type) { _diskType = type; _packName = null; _geometry = new DiskGeometry(type == DiabloDiskType.Diablo31 ? 203 : 406, 2, 12); _sectors = new DiabloDiskSector[_geometry.Cylinders, _geometry.Tracks, _geometry.Sectors]; }
public void NewPack(string path, DiskGeometry geometry) { if (_pack != null) { UpdateTrackCache(); _pack.Dispose(); } _pack = FileBackedDiskPack.CreateEmpty(geometry, path); Reset(); }
private InMemoryDiskPack(DiskGeometry geometry, string path, bool load) { _packName = path; _geometry = geometry; _sectors = new DiskSector[_geometry.Cylinders, _geometry.Heads, _geometry.Sectors]; if (load) { // // Attempt to load in the specified image file. // using (FileStream imageStream = new FileStream(_packName, FileMode.Open, FileAccess.Read)) { try { for (int cylinder = 0; cylinder < _geometry.Cylinders; cylinder++) { for (int head = 0; head < _geometry.Heads; head++) { for (int sector = 0; sector < _geometry.Sectors; sector++) { _sectors[cylinder, head, sector] = new DiskSector(_geometry.SectorGeometry, imageStream, cylinder, head, sector); } } } if (imageStream.Position != imageStream.Length) { throw new InvalidOperationException("Extra data at end of image file."); } } finally { imageStream.Close(); } } } else { // // Just initialize a new, empty disk. // for (int cylinder = 0; cylinder < _geometry.Cylinders; cylinder++) { for (int head = 0; head < _geometry.Heads; head++) { for (int sector = 0; sector < _geometry.Sectors; sector++) { _sectors[cylinder, head, sector] = new DiskSector(_geometry.SectorGeometry, cylinder, head, sector); } } } } }
/// <summary> /// Loads an existing image. /// </summary> /// <param name="geometry"></param> /// <param name="path"></param> /// <returns></returns> public static FileBackedDiskPack Load(DiskGeometry geometry, string path) { return(new FileBackedDiskPack(geometry, path, true)); }
/// <summary> /// Creates a new, empty disk pack with the specified geometry. /// </summary> /// <param name="geometry"></param> /// <param name="path"></param> public static FileBackedDiskPack CreateEmpty(DiskGeometry geometry, string path) { return(new FileBackedDiskPack(geometry, path, false)); }
/// <summary> /// Loads an existing disk pack image. /// </summary> /// <param name="geometry"></param> /// <param name="path"></param> /// <returns></returns> public static InMemoryDiskPack Load(DiskGeometry geometry, string path) { return(new InMemoryDiskPack(geometry, path, true)); }
/// <summary> /// Creates a new, empty disk pack with the specified geometry. /// </summary> /// <param name="geometry"></param> /// <param name="path"></param> public static InMemoryDiskPack CreateEmpty(DiskGeometry geometry, string path) { return(new InMemoryDiskPack(geometry, path, false)); }