/// <summary> /// Create a new VDK disk associated with the given stream. /// </summary> /// <param name="image">Stream for storing the disk image.</param> /// <param name="heads">Number of disk heads.</param> /// <param name="tracks">Number of tracks per head.</param> /// <param name="sectors">Number of sectors per track.</param> /// <returns>A disk object</returns> public static VdkDisk Create(Stream image, int heads, int tracks, int sectors) { if (image == null) { throw new ArgumentNullException("image"); } if (!image.CanRead) { throw new NotSupportedException("Disk image stream does not support reading"); } if (!image.CanSeek) { throw new NotSupportedException("Disk image stream does not support seeking"); } if (!image.CanWrite) { throw new NotSupportedException("Disk image stream does not support writing"); } var disk = new VdkDisk(image, heads, tracks, sectors); var header = new VdkHeader(heads, tracks); var headerRaw = header.Encode(); disk.vdkHeaderSize = headerRaw.Length; disk.DiskData = new byte[disk.vdkHeaderSize + heads * tracks * sectors * VdkSectorSize]; Array.Copy(headerRaw, disk.DiskData, disk.vdkHeaderSize); disk.IsWriteable = true; disk.IsModified = true; return(disk); }
/// <summary> /// Creates a new virtual disk image file and returns a Disk object associated with it. The file name extension determines the /// type of Disk object actually returned. /// </summary> /// <param name="filename">File name of virtual disk image.</param> /// <param name="heads">Number of disk heads.</param> /// <param name="tracks">Number of disk tracks per head.</param> /// <param name="sectors">Number of disk sectors per track and per head.</param> /// <param name="sectorsize">The size of each sector measured in bytes.</param> /// <returns>A Disk object associated with the given file.</returns> public static IDisk CreateDisk(string filename, int heads, int tracks, int sectors, int sectorsize) { filename = filename.ToLowerInvariant(); if (filename.EndsWith(".vdk")) { return(VdkDisk.Create(new FileStream(filename, FileMode.Create), heads, tracks, sectors)); } if (filename.EndsWith(".dsk")) { return(JvcDisk.Create(new FileStream(filename, FileMode.Create), heads, tracks, sectors, sectorsize)); } if (filename.EndsWith(".hfe")) { return(HfeDisk.Create(new FileStream(filename, FileMode.Create), heads, tracks, sectors, sectorsize)); } if (filename.EndsWith(".dmk")) { return(DmkDisk.Create(new FileStream(filename, FileMode.Create), heads, tracks, sectors, sectorsize)); } return(null); }
/// <summary> /// Reads a VDK disk image from a given stream. /// </summary> /// <param name="image">Stream containing the VDK disk image.</param> /// <param name="isWriteable">Allow write operations to this disk.</param> /// <returns>A disk object.</returns> public static VdkDisk Open(Stream image, bool isWriteable) { if (image == null) { throw new ArgumentNullException("image"); } if (!image.CanRead) { throw new NotSupportedException("Disk image stream does not support reading"); } var imageData = IOUtils.ReadStreamFully(image); var header = VdkHeader.Parse(imageData); int sectors = (imageData.Length - header.HeaderSize) / (header.Heads * header.Tracks * VdkSectorSize); var disk = new VdkDisk(image, header.Heads, header.Tracks, sectors); disk.DiskData = imageData; disk.vdkHeaderSize = header.HeaderSize; disk.IsWriteable = (isWriteable && image.CanSeek && image.CanWrite); return(disk); }
/// <summary> /// Returns a Disk object associated with an existing virtual disk image file. The name (extension) of the file name determines the /// type of Disk object actually returned. /// </summary> /// <param name="filename">File name of virtual disk image.</param> /// <param name="iswriteable">Returns a writeable Disk object if this is <value>true</value>.</param> /// <returns>A Disk object associated with the given file.</returns> public static IDisk OpenDisk(string filename, bool iswriteable) { filename = filename.ToLowerInvariant(); var access = iswriteable ? FileAccess.ReadWrite : FileAccess.Read; if (filename.EndsWith(".vdk")) { return(VdkDisk.Open(new FileStream(filename, FileMode.Open, access), iswriteable)); } if (filename.EndsWith(".dsk")) { return(JvcDisk.Open(new FileStream(filename, FileMode.Open, access), iswriteable)); } if (filename.EndsWith(".hfe")) { return(HfeDisk.Open(new FileStream(filename, FileMode.Open, access), iswriteable)); } if (filename.EndsWith(".dmk")) { return(DmkDisk.Open(new FileStream(filename, FileMode.Open, access), iswriteable)); } return(null); }
/// <summary> /// Create a new VDK disk associated with the given stream. /// </summary> /// <param name="image">Stream for storing the disk image.</param> /// <param name="heads">Number of disk heads.</param> /// <param name="tracks">Number of tracks per head.</param> /// <param name="sectors">Number of sectors per track.</param> /// <returns>A disk object</returns> public static VdkDisk Create(Stream image, int heads, int tracks, int sectors) { if (image == null) throw new ArgumentNullException("image"); if (!image.CanRead) throw new NotSupportedException("Disk image stream does not support reading"); if (!image.CanSeek) throw new NotSupportedException("Disk image stream does not support seeking"); if (!image.CanWrite) throw new NotSupportedException("Disk image stream does not support writing"); var disk = new VdkDisk(image, heads, tracks, sectors); var header = new VdkHeader(heads, tracks); var headerRaw = header.Encode(); disk.vdkHeaderSize = headerRaw.Length; disk.DiskData = new byte[disk.vdkHeaderSize + heads * tracks * sectors * VdkSectorSize]; Array.Copy(headerRaw, disk.DiskData, disk.vdkHeaderSize); disk.IsWriteable = true; disk.IsModified = true; return disk; }
/// <summary> /// Reads a VDK disk image from a given stream. /// </summary> /// <param name="image">Stream containing the VDK disk image.</param> /// <param name="isWriteable">Allow write operations to this disk.</param> /// <returns>A disk object.</returns> public static VdkDisk Open(Stream image, bool isWriteable) { if (image == null) throw new ArgumentNullException("image"); if (!image.CanRead) throw new NotSupportedException("Disk image stream does not support reading"); var imageData = IOUtils.ReadStreamFully(image); var header = VdkHeader.Parse(imageData); int sectors = (imageData.Length - header.HeaderSize)/(header.Heads*header.Tracks*VdkSectorSize); var disk = new VdkDisk(image, header.Heads, header.Tracks, sectors); disk.DiskData = imageData; disk.vdkHeaderSize = header.HeaderSize; disk.IsWriteable = (isWriteable && image.CanSeek && image.CanWrite); return disk; }