/// <summary> /// Initializes the boot sector and file system for the device. The file /// system created by this method will always be in read-write mode. /// </summary> /// <returns>the file system that was created</returns> /// <exception cref="System.IO.IOException">IOException on write error</exception> public FatFileSystem Format() { var sectorSize = device.GetSectorSize(); var totalSectors = (int)(device.GetSize() / sectorSize); FsInfoSector fsi; BootSector bs; if (sectorsPerCluster == 0) { throw new Exception(); } if (fatType == FatType.BaseFat32) { bs = new Fat32BootSector(device); InitBootSector(bs); var f32Bs = (Fat32BootSector)bs; f32Bs.SetFsInfoSectorNr(1); f32Bs.SetSectorsPerFat(SectorsPerFat(0, totalSectors)); var rnd = new Random(); f32Bs.SetFileSystemId(rnd.Next()); f32Bs.SetVolumeLabel(label); /* create FS info sector */ fsi = FsInfoSector.Create(f32Bs); } else { bs = new Fat16BootSector(device); InitBootSector(bs); var f16Bs = (Fat16BootSector)bs; var rootDirEntries = RootDirectorySize( device.GetSectorSize(), totalSectors); f16Bs.SetRootDirEntryCount(rootDirEntries); f16Bs.SetSectorsPerFat(SectorsPerFat(rootDirEntries, totalSectors)); if (label != null) { f16Bs.SetVolumeLabel(label); } fsi = null; } // bs.write(); if (fatType == FatType.BaseFat32) { var f32Bs = (Fat32BootSector)bs; /* possibly writes the boot sector copy */ f32Bs.WriteCopy(device); } var fat = Fat.Create(bs, 0); AbstractDirectory rootDirStore; if (fatType == FatType.BaseFat32) { rootDirStore = ClusterChainDirectory.CreateRoot(fat); fsi.SetFreeClusterCount(fat.GetFreeClusterCount()); fsi.SetLastAllocatedCluster(fat.GetLastAllocatedCluster()); fsi.Write(); } else { rootDirStore = Fat16RootDirectory.Create((Fat16BootSector)bs); } var rootDir = new FatLfnDirectory(rootDirStore, fat, false); rootDir.Flush(); for (var i = 0; i < bs.GetNrFats(); i++) { fat.WriteCopy(FatUtils.GetFatOffset(bs, i)); } bs.Write(); var fs = FatFileSystem.Read(device, false); if (label != null) { fs.SetVolumeLabel(label); } fs.Flush(); return(fs); }