示例#1
0
        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);
        }
示例#2
0
 internal void Kill()
 {
     lock (_syncRoot)
     {
         _pageStream.Dispose();
         _pageStream = null;
         _manager    = null;
     }
 }
示例#3
0
                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;
					}
				}