内存映射文件

#include <windows.h>
#include <tchar.h>

int main(int argc, char* argv[])
{
	HANDLE hFile = CreateFile("c:\\a.txt",  //使用相对路径
		GENERIC_READ|GENERIC_WRITE, //以读写方式打开文件
		FILE_SHARE_READ | FILE_SHARE_WRITE,  //以共享读的方式打开
		NULL,  //不设置安全属性
		CREATE_ALWAYS, 
		FILE_ATTRIBUTE_NORMAL, //不设置文件属性
		NULL   //不设置模板文件句柄
		);
	if (hFile == INVALID_HANDLE_VALUE)
	{
		printf(_T("打开文件失败"));
		return -1;
	}
	// 创建内存映射对象
	HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 
		0, strlen("Hello Ternsoft.com!"), NULL); //映射内存大小与文件大小相同
	if (hMap == NULL)
	{
		printf(_T("创建内存映射文件失败,%d\n"),GetLastError());
		return -2;
	}
	// 映射整个"c:\\a.txt"文件到内存,返回这块内存的首地址
	LPVOID lpBase = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
	if (hMap == NULL)
	{
		printf(_T("映射文件到内存失败"));
		return -3;
	}
	//此时lpBase指针所指向的内存就是c:\\a.txt文件中的内容。
	//修改这块内存中的内容就等于修改文件内容。
	strcpy((char *)lpBase, "Hello MemoryCat.com!"); //见文件内容修改为"Hello MemoryCat.com!"
	printf("%s\n",(char *)lpBase); //打印文件内容:这里是"Hello MemoryCat.com!"
	UnmapViewOfFile(lpBase);  //撤销映射
	CloseHandle(hMap);        //关闭内存映射文件对象句柄
	CloseHandle(hFile);       //关闭文件句柄
	return 0;
}
评论列表
2015-03-05 14:30:49 1
HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);  

如果 GetLastError 返回 1006 (文件所在的卷已被外部更改,因此打开的文件不再有效。)

 DWORD dwMaximumSizeHigh,   // high-order 32 bits of object size
 DWORD dwMaximumSizeLow, // low-order 32 bits of object size

0,0 改为文件的大小就好了.

 

2015-03-05 14:31:17 1
HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);  

如果 GetLastError 返回 1006 (文件所在的卷已被外部更改,因此打开的文件不再有效。)

 DWORD dwMaximumSizeHigh,   // high-order 32 bits of object size
 DWORD dwMaximumSizeLow, // low-order 32 bits of object size

0,0 改为文件的大小就好了.