/// <summary> /// Constructor for FatFileSystem in specified readOnly mode /// </summary> /// <param name="device">the <see cref="IBlockDevice"/> holding the file system</param> /// <param name="readOnly"></param> /// <param name="ignoreFatDifferences"></param> /// <exception cref="IOException">IOException on read error</exception> private FatFileSystem(IBlockDevice device, bool readOnly, bool ignoreFatDifferences) : base(readOnly) { bs = BootSector.Read(device); if (bs.GetNrFats() <= 0) { throw new IOException( "boot sector says there are no FATs"); } filesOffset = FatUtils.GetFilesOffset(bs); fatType = bs.GetFatType(); fat = Fat.Read(bs, 0); if (!ignoreFatDifferences) { for (var i = 1; i < bs.GetNrFats(); i++) { var tmpFat = Fat.Read(bs, i); if (!fat.Equals(tmpFat)) { throw new IOException("FAT " + i + " differs from FAT 0"); } } } if (fatType == FatType.BaseFat32) { var f32Bs = (Fat32BootSector)bs; var rootDirFile = new ClusterChain(fat, f32Bs.GetRootDirFirstCluster(), IsReadOnly()); rootDirStore = ClusterChainDirectory.ReadRoot(rootDirFile); fsiSector = FsInfoSector.Read(f32Bs); if (fsiSector.GetFreeClusterCount() != fat.GetFreeClusterCount()) { throw new IOException("free cluster count mismatch - fat: " + fat.GetFreeClusterCount() + " - fsinfo: " + fsiSector.GetFreeClusterCount()); } } else { rootDirStore = Fat16RootDirectory.Read((Fat16BootSector)bs, readOnly); fsiSector = null; } rootDir = new FatLfnDirectory(rootDirStore, fat, IsReadOnly()); }
/// <summary> /// Reads a <see cref="Fat"/> as specified by a <see cref="BootSector"/>. /// </summary> /// <param name="bs">the boot sector specifying the <see cref="Fat"/> layout</param> /// <param name="fatNr">the number of the <see cref="Fat"/> to read</param> /// <returns>the <see cref="Fat"/> that was read</returns> /// <exception cref="IOException">IOException on read error</exception> /// <exception cref="ArgumentException">ArgumentException if fatNr is greater than /// <see cref="BootSector.GetNrFats"/></exception> public static Fat Read(BootSector bs, int fatNr) { if (fatNr > bs.GetNrFats()) { throw new ArgumentException( "boot sector says there are only " + bs.GetNrFats() + " FATs when reading FAT #" + fatNr); } var fatOffset = FatUtils.GetFatOffset(bs, fatNr); var result = new Fat(bs, fatOffset); result.Read(); return(result); }