private void Initialize(object file) { if ((ViewPageTotalSize / ViewPageCount) % this.BlockSize != 0) { throw new ArgumentException(string.Format("This '{0}' value of blockSize parameter is invalid.", this.BlockSize)); } //计算缓存区总共有多少个存储块 _blockCount = (int)(StorageSize / this.BlockSize); //计算缓存区的总大(为存储区长度+索引区长度+分配表区长度+文件头长度) _capacity = StorageSize + (_blockCount * 4) + (36 * BufferUtility.KB) + MetadataInfo.HeadSize; //判断传入参数是否为文件流 var fileStream = file as FileStream; if (fileStream == null) { var fileInfo = new FileInfo((string)file); if (fileInfo.Exists && fileInfo.Length > 0 && fileInfo.Length != _capacity) { throw new ArgumentException("file"); } fileStream = new FileStream((string)file, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, this.BlockSize, FileOptions.RandomAccess); if (fileStream.Length == 0) { fileStream.SetLength(_capacity); } } else { if (fileStream.Length > 0 && fileStream.Length != _capacity) { throw new ArgumentException("file"); } } //创建内存映射文件对象 _memoryMappedFile = MemoryMappedFile.CreateFromFile(fileStream, Path.GetFileName(fileStream.Name), _capacity, MemoryMappedFileAccess.ReadWrite, null, HandleInheritability.Inheritable, false); //构建默认的元数据描述对象 _metadata = MetadataInfo.Create(this.BlockSize, _blockCount); //创建缓存页面管理器对象 _pageManager = new MemoryMappedPageManager(this, (uint)_metadata.StorageOffset); }
internal void Kill() { lock (_syncRoot) { _pageStream.Dispose(); _pageStream = null; _manager = null; } }
internal MemoryMappedPage(MemoryMappedPageManager manager, int pageIndex, Stream pageStream) { if (manager == null) { throw new ArgumentNullException("manager"); } if (pageIndex < 0) { throw new ArgumentOutOfRangeException("pageIndex"); } if (pageStream == null) { throw new ArgumentNullException("pageStream"); } _syncRoot = new object(); _manager = manager; _pageIndex = pageIndex; _pageStream = pageStream; }
internal MemoryMappedPage(MemoryMappedPageManager manager, int pageIndex, Stream pageStream) { if(manager == null) throw new ArgumentNullException("manager"); if(pageIndex < 0) throw new ArgumentOutOfRangeException("pageIndex"); if(pageStream == null) throw new ArgumentNullException("pageStream"); _syncRoot = new object(); _manager = manager; _pageIndex = pageIndex; _pageStream = pageStream; }
private void Initialize(object file) { if((ViewPageTotalSize / ViewPageCount) % this.BlockSize != 0) throw new ArgumentException(string.Format("This '{0}' value of blockSize parameter is invalid.", this.BlockSize)); //计算缓存区总共有多少个存储块 _blockCount = (int)(StorageSize / this.BlockSize); //计算缓存区的总大(为存储区长度+索引区长度+分配表区长度+文件头长度) _capacity = StorageSize + (_blockCount * 4) + (36 * BufferUtility.KB) + MetadataInfo.HeadSize; //判断传入参数是否为文件流 var fileStream = file as FileStream; if(fileStream == null) { var fileInfo = new FileInfo((string)file); if(fileInfo.Exists && fileInfo.Length > 0 && fileInfo.Length != _capacity) throw new ArgumentException("file"); fileStream = new FileStream((string)file, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, this.BlockSize, FileOptions.RandomAccess); if(fileStream.Length == 0) fileStream.SetLength(_capacity); } else { if(fileStream.Length > 0 && fileStream.Length != _capacity) throw new ArgumentException("file"); } //创建内存映射文件对象 _memoryMappedFile = MemoryMappedFile.CreateFromFile(fileStream, Path.GetFileName(fileStream.Name), _capacity, MemoryMappedFileAccess.ReadWrite, null, HandleInheritability.Inheritable, false); //构建默认的元数据描述对象 _metadata = MetadataInfo.Create(this.BlockSize, _blockCount); //创建缓存页面管理器对象 _pageManager = new MemoryMappedPageManager(this, (uint)_metadata.StorageOffset); }
internal void Kill() { lock(_syncRoot) { _pageStream.Dispose(); _pageStream = null; _manager = null; } }