Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        private void WriteHeader()
        {
            var fsHeader = new FSHeader
            {
                AllocationBlock    = allocationManager.BlockId,
                RootDirectoryBlock = RootDirectory.BlockId,
                FreeBlockCount     = allocationManager.ReleasedBlockCount
            };

            storage.WriteBlock(0, new[] { fsHeader });
        }
Esempio n. 3
0
        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;
        }
Esempio n. 4
0
        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;
        }