http://msdn2.microsoft.com/en-us/library/aa366556(VS.85).aspx
上面是msdn链接,关于File Mapping的。
简单的翻译几点:
"File mapping" 是文件内容和进程虚拟地址空间某一部分的联系,系统创建一个"file mapping object "对象来维护这种联系。
"file view "是进程用来访问文件内容的那部分虚拟地址空间。
该技术可以有效的操作大型数据文件,而不用全部都读入到内存中,多个进程也可以使用它共享数据。
进程使用指针从"file view "读取或写入数据,需要注意的是对指针的操作并不一定马上就写入文件,很可能写到cache中,可以使用" FlushViewOfFile "来强制写入。
下面是例图:
使用该技术只需要简单的几步即可,当然对于修改,删除,插入的操作就有点复杂了,但这是每种文件操作都不可避免的。
1. 使用"CreateFile"打开要操作的文件,我们需要他返回来的句柄,除了访问权限和共享模式没什么要注意的了。
2.使用"CreateFileMapping"来创建一个"filemapping"对象,这里参数size有点说道,下面要创建的file view的大小不能超过这里设置的数值,并且现在创建的对象的大小将是固定的,在后面的操作中不能变化,如果你指定的size比原文件大的话,系统会扩充你的原文件到指定大小,如果指定的size比原文件小的话,只影响下面将要创建的file view的最大值。现在指定的大小并不会产生任何资源消耗。
所以对于读文件完全可以把size设成0这样就会按原文件的大小来创建"filemapping"对象。注意,文件的大小不能为0,否则回返回"ERROR_FILE_INVALID"。
对于写文件操作的话,你需要对最终的文件长度有个估算,然后以估算的大小来创建,否则你就没地方追加数据了。
如果你要view的那部分不在文件的开头,那么你创建的size就应该是,view的大小加上在文件中的偏移量。举例说明:在文件的128K的位置开始要读1K的数据,那么你创建的size就应该是128 + 1 = 129K,详见msdn链接。
http://msdn2.microsoft.com/en-us/library/aa366548(VS.85).aspx
3. 使用"MapViewOfFile"把数据map到内存地址空间,这里要注意的是offset必须是"allocation granularity"的整数倍,使用"GetSystemInfo"来获取。返回的指针就是我们要操作的对象了。
4.善后工作使用"UnmapViewOfFile","CloseHandle","SetEndOfFile"这些即可。
简单吧就这些,要是能完美的实现增,删,改,查的话,那就没得说了,使用中读取比较好弄,可以用memchr搜索想要的东西,然后判断后面的字符,或者赋给string然后操作,删除某一块,也还过得去,需要用2个view来回考数据,插入就不知道了,除了在复制一份还有什么好方法,如果谁知道,麻烦你留个言,谢谢了先。欢迎就此问题讨论。