/// <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(); }