最近一直为文件内存映射发愁,整个两周一直折腾这个东西。在64位系统和32位系统还要针对内存的高低位进行计算。好麻烦。。还是没搞定

偶然从MSDN上发现.NET 4.0把内存文件映射加到了.NET类库中。。好像方便了很多啊。。比用C#直接调用WINDOWS API方便多了。所以

这个必须果断记录之。。。项目马上要用,为了加强内存数据交换的效率。。这个。。。必须啊。。

任务

使用的方法或属性

从磁盘上的文件中获取表示持久内存映射文件的 MemoryMappedFile 对象。

MemoryMappedFile.CreateFromFile 方法。

获取表示非持久内存映射文件(与磁盘上的文件不关联)的 MemoryMappedFile 对象。

MemoryMappedFile.CreateNew 方法。

- 或 -

MemoryMappedFile.CreateOrOpen 方法。

获取现有内存映射文件(持久文件或非持久文件)的 MemoryMappedFile 对象。

MemoryMappedFile.OpenExisting 方法。

获取针对内存映射文件的顺序访问视图的 UnmanagedMemoryStream 对象。

MemoryMappedFile.CreateViewStream 方法。

获取针对内存映射文件的随机访问视图的 UnmanagedMemoryAccessor 对象。

MemoryMappedFile.CreateViewAccessor 方法。

获取要用于非托管代码的 SafeMemoryMappedViewHandle 对象。

MemoryMappedFile.SafeMemoryMappedFileHandle 属性。

- 或 -

MemoryMappedViewAccessor.SafeMemoryMappedViewHandle 属性。

- 或 -

MemoryMappedViewStream.SafeMemoryMappedViewHandle 属性。

将内存分配推迟到创建视图后进行(仅限于非持久文件)。

(若要确定当前系统页大小,请使用 Environment.SystemPageSize 属性。)

带 MemoryMappedFileOptions.DelayAllocatePages 值的 CreateNew 方法。

- 或 -

将 MemoryMappedFileOptions 枚举作为参数的 CreateOrOpen 方法。

持久文件内存映射:

CreateFromFile 方法基于磁盘上的现有文件创建一个内存映射文件。

  1.  
  2.  1 using System;
  3.  2 using System.IO;
  4.  3 using System.IO.MemoryMappedFiles;
  5.  4 using System.Runtime.InteropServices;
  6.  5 
  7.  6 class Program
  8.  7 {
  9.  8     static void Main(string[] args)
  10.  9     {
  11. 10         long offset = 0x10000000; // 256 megabytes
  12. 11         long length = 0x20000000; // 512 megabytes
  13. 12 
  14. 13         // Create the memory-mapped file.
  15. 14         using (var mmf = MemoryMappedFile.CreateFromFile(@"c:\ExtremelyLargeImage.data", FileMode.Open,"ImgA"))
  16. 15         {
  17. 16             // Create a random access view, from the 256th megabyte (the offset)
  18. 17             // to the 768th megabyte (the offset plus length).
  19. 18             using (var accessor = mmf.CreateViewAccessor(offset, length))
  20. 19             {
  21. 20                 int colorSize = Marshal.SizeOf(typeof(MyColor));
  22. 21                 MyColor color;
  23. 22 
  24. 23                 // Make changes to the view.
  25. 24                 for (long i = 0; i < length; i += colorSize)
  26. 25                 {
  27. 26                     accessor.Read(i, out color);
  28. 27                     color.Brighten(10);
  29. 28                     accessor.Write(i, ref color);
  30. 29                 }
  31. 30             }
  32. 31         }
  33. 32     }
  34. 33 }
  35. 34 
  36. 35 public struct MyColor
  37. 36 {
  38. 37     public short Red;
  39. 38     public short Green;
  40. 39     public short Blue;
  41. 40     public short Alpha;
  42. 41 
  43. 42     // Make the view brigher.
  44. 43     public void Brighten(short value)
  45. 44     {
  46. 45         Red = (short)Math.Min(short.MaxValue, (int)Red + value);
  47. 46         Green = (short)Math.Min(short.MaxValue, (int)Green + value);
  48. 47         Blue = (short)Math.Min(short.MaxValue, (int)Blue + value);
  49. 48         Alpha = (short)Math.Min(short.MaxValue, (int)Alpha + value);
  50. 49     }
  51. 50 }

非持久文件内存映射:

CreateNew 和 CreateOrOpen 方法创建一个未映射到磁盘上的现有文件的内存映射文件。

  1.  
  2.  1 using System;
  3.  2 using System.IO;
  4.  3 using System.IO.MemoryMappedFiles;
  5.  4 using System.Threading;
  6.  5 
  7.  6 class Program
  8.  7 {
  9.  8     // Process A:
  10.  9     static void Main(string[] args)
  11. 10     {
  12. 11         using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("testmap", 10000))
  13. 12         {
  14. 13             bool mutexCreated;
  15. 14             Mutex mutex = new Mutex(true, "testmapmutex", out mutexCreated);
  16. 15             using (MemoryMappedViewStream stream = mmf.CreateViewStream())
  17. 16             {
  18. 17                 BinaryWriter writer = new BinaryWriter(stream);
  19. 18                 writer.Write(1);
  20. 19             }
  21. 20             mutex.ReleaseMutex();
  22. 21 
  23. 22             Console.WriteLine("Start Process B and press ENTER to continue.");
  24. 23             Console.ReadLine();
  25. 24 
  26. 25             Console.WriteLine("Start Process C and press ENTER to continue.");
  27. 26             Console.ReadLine();
  28. 27 
  29. 28             mutex.WaitOne();
  30. 29             using (MemoryMappedViewStream stream = mmf.CreateViewStream())
  31. 30             {
  32. 31                 BinaryReader reader = new BinaryReader(stream);
  33. 32                 Console.WriteLine("Process A says: {0}", reader.ReadBoolean());
  34. 33                 Console.WriteLine("Process B says: {0}", reader.ReadBoolean());
  35. 34                 Console.WriteLine("Process C says: {0}", reader.ReadBoolean());
  36. 35             }
  37. 36             mutex.ReleaseMutex();
  38. 37         }
  39. 38     }

.NET Framework自带的文件内存映射类的更多相关文章

  1. c++/MFC 封装好的文件内存映射类

    整理日: 2015年2月16日 首先介绍内存映射文件操作------函数的用法以及先后执行顺序 // 第一步:创建文件 HANDLE hFile = CreateFileForMapping(_T(& ...

  2. java大文件读写操作,java nio 之MappedByteBuffer,高效文件/内存映射

    java处理大文件,一般用BufferedReader,BufferedInputStream这类带缓冲的Io类,不过如果文件超大的话,更快的方式是采用MappedByteBuffer. Mapped ...

  3. MMAP文件内存映射

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  4. 使用CodeSmith快速生成映射文件和映射类

    一 CodeSmith简介 本文以表自动生成NHibernate的映射文件和映射类的实例来说明一下本软件的使用方法. CodeSmith是一种基于模板的代码生成工具,其使用类似于ASP.NET的语法来 ...

  5. hibernate 的映射文件快速生成:使用CodeSmith快速生成映射文件和映射类

    一 CodeSmith简介 本文以表自动生成NHibernate的映射文件和映射类的实例来说明一下本软件的使用方法. CodeSmith是一种基于模板的代码生成工具,其使用类似于ASP.NET的语法来 ...

  6. 【JavaNIO的深入研究4】内存映射文件I/O,大文件读写操作,Java nio之MappedByteBuffer,高效文件/内存映射

    内存映射文件能让你创建和修改那些因为太大而无法放入内存的文件.有了内存映射文件,你就可以认为文件已经全部读进了内存,然后把它当成一个非常大的数组来访问.这种解决办法能大大简化修改文件的代码.fileC ...

  7. cocos2d 文件系统使用文件内存映射性能对比

    //cocos 修改代码 ..... //性能测试代码 extern "C" { #include <time.h> #include <stdlib.h> ...

  8. windows内存映射学习及帮助类实现

    本文通过创建文件内存映射类,学习windows内存映射相关知识:创建内存映射文件后,可以按照内存操作方式操作文件:支持32位程序处理超过4G大小的文件. 感谢http://blog.csdn.net/ ...

  9. 《Java核心技术卷二》笔记(二)文件操作和内存映射文件

    文件操作 上一篇已经总结了流操作,其中也包括文件的读写.文件系统除了读写以为还有很多其他的操作,如复制.移动.删除.目录浏览.属性读写等.在Java7之前,一直使用File类用于文件的操作.Java7 ...

随机推荐

  1. Flask-论坛开发-3-数据库

    对Flask感兴趣的,可以看下这个视频教程:http://study.163.com/course/courseLearn.htm?courseId=1004091002 1. SQLAlchemy ...

  2. tftp服务、串口工具minicom

    linux下安装tftp服务 参考这位仁兄的经验 确实百度上很多关于配置tftp服务的方法,但是这篇文章的介绍真的是很精简,对于一个刚接触纯linux环境的小白来说是很舒服的一件事. 首先是安装tft ...

  3. JavaScript 作用域链与闭包

    作用域链 在某个作用域访问某个变量或者函数时,会首先在自己的局部环境作用域中搜寻变量或者函数,如果本地局部环境作用域中有该变量或者函数,则就直接使用找到的这个变量值或者函数:如果本地局部环境作用域中没 ...

  4. docker container can not connect internet

    https://stackoverflow.com/questions/23810845/i-cant-get-docker-containers-to-access-the-internet htt ...

  5. [转帖]Windows7 结束更新 以及后期更新花费。

    你不应该为Windows 7更新付费的三个原因 https://www.linuxidc.com/Linux/2019-02/156777.htm 对Windows 7的支持将在2020年1月结束,这 ...

  6. [转帖] IIS经典模式和集成模式的区别

    在 IIS 7.0 中,应用程序池有两种运行模式:集成模式和经典模式. https://blog.csdn.net/hongwei_23/article/details/44300923 这里面添加一 ...

  7. Delphi之Exception获得错误信息(简单好理解)

    Delphi之Exception获得错误信息 相关资料: http://www.cnblogs.com/hackpig/archive/2010/02/15/1668547.html 实例代码: 1 ...

  8. codeforces548B

    Mike and Fun CodeForces - 548B Mike and some bears are playing a game just for fun. Mike is the judg ...

  9. MT【237】阿基米德三角形的一些常见性质

    阿基米德三角形的常见性质:抛物线:$x^2=2py,AB$为抛物线的弦,$AQ,BQ$为切线,记$Q(x_0,y_0)$则$1)k_{QA}*k_{QB}=\dfrac{p}{2x_0}$$2)k_{ ...

  10. MT【11】对数放缩题

    解答:C 评论:这里讲几个背景知识