private FSHeader CreateFile() { var buffer = new byte[512]; var fsHeader = new FSHeader { AllocationBlock = AllocationBlockId, RootDirectoryBlock = RootDirectoryBlockId, FreeBlockCount = 0 }; storage.WriteBlock(0, new[] { fsHeader }); storage.WriteBlock(1, buffer); buffer[0] = RootDirectoryDataBlockId; storage.WriteBlock(2, buffer); var fsRoot = new DirectoryHeader { FirstEmptyItemOffset = 1, ItemsCount = 0, LastNameOffset = 0, NameBlockIndex = NameBlockIndex, ParentDirectoryBlockIndex = RootDirectoryBlockId }; storage.WriteBlock(RootDirectoryDataBlockId, new[] { new DirectoryHeaderRoot { Header = fsRoot } }); buffer[0] = 0; storage.WriteBlock(NameBlockIndex, buffer); return(fsHeader); }
private void WriteHeader() { var fsHeader = new FSHeader { AllocationBlock = allocationManager.BlockId, RootDirectoryBlock = RootDirectory.BlockId, FreeBlockCount = allocationManager.ReleasedBlockCount }; storage.WriteBlock(0, new[] { fsHeader }); }
private void InitializeFromHeader(IBlockStorage blockStorage, FSHeader header) { var allocationIndexFactory = new GenericFactory <IIndex <int>, IAllocationManager>( m => { var accessParameters = new CommonAccessParameters(blockStorage, m); var allocationIndexProvider = indexBlockProviderFactory.Create(header.AllocationBlock, accessParameters); return(indexFactory.Create(allocationIndexProvider, accessParameters)); }); allocationManager = allocationManagerFactory.Create(allocationIndexFactory, blockStorage, header.FreeBlockCount); var dictionaryCache = directoryCacheFactory.Create(new CommonAccessParameters(blockStorage, allocationManager)); var rootDirectory = dictionaryCache.ReadDirectory(header.RootDirectoryBlock); RootDirectory = rootDirectory; DirectoryCache = dictionaryCache; }
public void Open(string fileName, OpenMode openMode) { if (fileName == null) { throw new ArgumentNullException(nameof(fileName)); } if (isOpened) { throw new InvalidOperationException("File system is already opened"); } storage = blockStorageFactory.Create(fileName); storage.Open(openMode); try { FSHeader header; if (openMode == OpenMode.Create) { header = CreateFile(); } else { var headers = new FSHeader[1]; storage.ReadBlock(0, headers); header = headers[0]; } InitializeFromHeader(storage, header); } catch { storage.Dispose(); } isOpened = true; }