内存映射的使用——实现大文件内容倒序

    内存映射文件使用的步骤:
  1. 打开文件内核对象           CreateFile
  2. 创建文件映射内核对象    CreateFileMapping
  3. 将数据映射到地址空间    MapViewOfFile
  4. 撤销文件数据的映射        UnmapViewOfFile
  5. 关闭文件映射                   CloseHandle
  6. 关闭文件对象                   CloseHandle

文件内容倒序代码:

 

	// 1. 打开文件内核对象
	HANDLE hfile = CreateFile("F:\\MMFTEST.txt",GENERIC_READ | GENERIC_WRITE,
		0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	
	if (hfile == INVALID_HANDLE_VALUE)
	{
		DWORD err = GetLastError();
		cerr << _T("Open File Error: %d",err) << endl;
		CloseHandle(hfile);
		return 0 ;
	}

	DWORD dwFileSize = GetFileSize(hfile,NULL);

	//2.创建文件映射内核对象
	HANDLE hfilemap = CreateFileMapping(hfile,NULL,PAGE_READWRITE,0,dwFileSize+sizeof(WCHAR),NULL); //增加一个\0的长度

	if (hfilemap == NULL)
	{
		DWORD err = GetLastError();
		cerr << _T("Open File Map Error: %d",err) << endl;
		CloseHandle(hfilemap);
		CloseHandle(hfile);
		return 0 ;
	}

	//3.将数据映射到地址空间
	PVOID pbFile = MapViewOfFile(hfilemap,FILE_MAP_WRITE,0,0,0);
	
	if (pbFile == NULL)
	{
		DWORD err = GetLastError();
		cerr << _T("Map File Error: %d",err) << endl;
		CloseHandle(hfilemap);
		CloseHandle(hfile);
		return 0 ;
	}

	//此处不考虑Unicode的情况
	PSTR pch = (PSTR)pbFile;

	//最后一位补0
	pch[dwFileSize/sizeof(CHAR)] = 0;
	_strrev(pch);

	//修复\r\n的错误
	pch = strchr(pch,'\n');
	while(pch != NULL)
	{
		*pch++ = '\r';
		*pch++ = '\n';
		pch = strchr(pch,'\n');
	}

	//4.撤销文件数据的映射
	UnmapViewOfFile(pbFile);

	//5.关闭文件映射
	CloseHandle(hfilemap);

	//去掉补入的\0
	SetFilePointer(hfile,dwFileSize,NULL,FILE_BEGIN);
	SetEndOfFile(hfile);

	//6.关闭文件对象
	CloseHandle(hfile);


  

本篇博客出自阿修罗道,转载请注明出处:http://blog.csdn.net/fansongy/article/details/8163571

 

你可能感兴趣的:(内存映射)