日期:2014-05-18  浏览次数:20916 次

C#内存映射问题:如何将多次映射的内存合并为一个文件?
偶通过内存映射将文件数据 Marshal.Copy(IntPrt, Byte[], Int32, Int32) 到 byte[] 中处理,每次映射 64M ,之后又 Marshal.Copy(Byte[], Int32, IntPrt, Int32) 到另一个 MapViewOfFile 中,最后存盘得到一个新的文件,同时不会破坏原始文件。

当原始文件小于 64M 时,直接复制、存盘即可
当原始文件大于 64M 时,就必须进行分段映射,然后处理、复制、存盘,此时偶必须将 CreateFileMapping(mapHandle, IntPtr.Zero, PAGE_READWRITE, 0, (UInt32)mapLength, mapName) 的第5个参数大小指定为实际文件大小才能正确处理。如果文件大于 2G 就行不通了。设想还是每次处理 64M ,但不知如何将内存中的数据依次写盘,前提是只通过内存映射的方式(Steram.IO & API中WirteFile()已经实现,这个问题纯粹想学习内存映射)。

C#.NET 2

------解决方案--------------------
CreateFileMapping(mapHandle, IntPtr.Zero, PAGE_READWRITE, 0, (UInt32)mapLength, mapName) 中第4、5个参数分别为文件大小的高32位和低32位。如果文件不大于4G,第5个参数大小指定为实际文件大小是正确的。