使用内存映射文件,必须执行下列步骤:
1)创建或打开一个文件内核对象,该对象用于标识磁盘上你想用作内存映射文件的文件。
2)创建一个文件映射内核对象,告诉系统该文件的大小和你打算如何访问该文件。
3)让系统将文件映射对象的全部或一部分映射到你的进程地址空间中。
4)告诉系统从你的进程的地址空间中撤销文件映射内核对象的映像。
5)关闭文件映射内核对象。
6)关闭文件内核对象。
程序实现了文件倒序
#include "stdafx.h"
#include "windows.h"
#include "tchar.h"
#include "string.h"
BOOL FileReverse(PCTSTR pszPathname,BOOL pfisTextUnicode)
{
HANDLE hfile=CreateFile(pszPathname,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(hfile == INVALID_HANDLE_VALUE){
return(FALSE);
}
DWORD dwFileSize = GetFileSize(hfile,NULL);//获取文件的大小
HANDLE hfilemap=CreateFileMapping(hfile,NULL,PAGE_READWRITE,0,dwFileSize + sizeof(WCHAR),NULL);
if(hfilemap == NULL){
CloseHandle(hfile);
return(FALSE);
}
PVOID pvFile=MapViewOfFile(hfilemap,FILE_MAP_WRITE,0,0,0);
if(pvFile == NULL){
CloseHandle(hfilemap);
CloseHandle(hfile);
return(FALSE);
}
int iUnicodeTestFlags = -1;
pfisTextUnicode = IsTextUnicode(pvFile,dwFileSize,&iUnicodeTestFlags);
if(!pfisTextUnicode){
PSTR pchANSI=(PSTR)pvFile;
pchANSI[dwFileSize/sizeof(CHAR)]=0;
_strrev(pchANSI);
pchANSI=strchr(pchANSI,'\n');
while(pchANSI != NULL){
*pchANSI++ = '\r';
*pchANSI++ = '\n';
pchANSI=strchr(pchANSI,'\n');
}
}else{
PWSTR pchUnicode = (PWSTR)pvFile;
pchUnicode[dwFileSize/sizeof(WCHAR)] = 0;
if((iUnicodeTestFlags & IS_TEXT_UNICODE_SIGNATURE ) != 0){
pchUnicode++;
}
_wcsrev(pchUnicode);
pchUnicode = wcschr(pchUnicode,L'\n');
while(pchUnicode != NULL){
*pchUnicode++ = L'\r';
*pchUnicode++ = L'\n';
pchUnicode=wcschr(pchUnicode,L'\n');
}
}
UnmapViewOfFile(pvFile);
CloseHandle(hfilemap);
SetFilePointer(hfile,dwFileSize,NULL,FILE_BEGIN);
SetEndOfFile(hfile);
CloseHandle(hfile);
return(TRUE);
}