Esempio n. 1
0
        /// <summary>
        /// 读取文件
        /// 20M分段读取
        /// </summary>
        /// <param name="path"></param>
        /// <param name="mapName"></param>
        public async void ReadAllSegmentFileAsync(string path, string mapName = null)
        {
            IsComplete = false;
            FileInfo file = new FileInfo(path);

            if (!file.Exists)
            {
                return;
            }

            long       offset = 0;
            long       len    = 0;
            long       size   = DefaultSize;
            FileStream fs     = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, fsCacheSize);

            len = fs.Length;
            //读取文件,capacity参数不能小于文件长度;
            //但是capacity只是一个值,并不是就需要这么大内存
            //内存在下一步创建视图时确定大小
            //需要把视图部分加载到内存
            using (MemoryMappedFile memoryFile = MemoryMappedFile.CreateFromFile(fs, mapName, 0, MemoryMappedFileAccess.Read, HandleInheritability.None, true))
            {
                while (len > 0)
                {
                    //20M读取
                    //
                    size = len > DefaultSize ? DefaultSize : len;
                    //offset,size参数决定了当前访问位置及内存中大小。
                    using (var accessor = memoryFile.CreateViewAccessor(offset, size, MemoryMappedFileAccess.Read))
                    {
                        int index = 0;  //当前读取
                        int r     = 0;  //当前读取长度
                        offset += size; //设置便宜值
                        len    -= size; //剩余长度
                        while (true)
                        {
                            BaseBuffer <byte[]> item = null;
                            if (mapPool.TryGetBuffer(out item, 1000))
                            {
                                MemoryMapBuffer buf = (MemoryMapBuffer)item;
                                r        = accessor.ReadArray <byte>(index, buf.Data, buf.OffSet, buf.Capacity);
                                index   += r;
                                buf.Size = r;
                                lock (lock_obj)
                                {
                                    lstData.Add(buf);
                                }
                                if (r < buf.Size || index >= DefaultSize)
                                {
                                    //20M读取完成
                                    break;
                                }
                            }
                            else
                            {
                                Console.WriteLine("MemoryMapStream:无法获取缓存,业务处理慢");
                            }
                        }
                    }
                }
            }
            IsComplete = true;
            fs.Close();
        }