#include "stdafx.h" #include <windows.h> #include <iostream> using namespace std;
string GetValue(const char* lpbMapAddress, const char* sName);
int main() { HANDLE hFile = CreateFile( TEXT("E:\\test.txt"), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) { cout<< "创建文件对象失败,错误代码: "<<GetLastError()<<endl; return 0; }
//// 得到文件尺寸 //DWORD dwFileSizeHigh; //__int64 qwFileSize = GetFileSize(hFile, &dwFileSizeHigh); //qwFileSize |= (((__int64)dwFileSizeHigh) << 32); //// //DWORD sizeRead; //_tstring strR; //char p[MAX_PATH] = {0}; //一定要用char的数组而不能用TCHAR,因为若是UNICODE,那么TCHAR是两个字节的宽字符, //但是ReadFile只能一个字节一个字节的读,这样会把两个单字节字符读到一个宽字节里面, //然后把这2个字符当做一个宽字节字符来解读就会出错! //bool bRestule = ReadFile(hFile, p, qwFileSize, &sizeRead, NULL);
// 创建文件映射对象 HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL); if (hFileMap == NULL) { cout<<"创建文件映射对象失败,错误代码: "<<GetLastError()<<endl; return 0; }
// 得到系统分配粒度 SYSTEM_INFO SysInfo; GetSystemInfo(&SysInfo); DWORD dwGran = SysInfo.dwAllocationGranularity;
// 得到文件尺寸 DWORD dwFileSizeHigh; __int64 qwFileSize = GetFileSize(hFile, &dwFileSizeHigh); qwFileSize |= (((__int64)dwFileSizeHigh) << 32);
// 关闭文件对象 CloseHandle(hFile);
// 偏移地址 __int64 qwFileOffset = 0;
// 块大小 DWORD dwBlockBytes = 0; for (int i=1; ;++i) { if (qwFileSize <= i * dwGran) { dwBlockBytes = i * dwGran; break; } }
if (qwFileOffset >= 0) { // 映射视图 //如果在调用MapViewOfFile()的时候,dwNumberOfBytesToMap如果大于文件的size,那么该call就会失败, //并且error code是access denied。所以MapViewOfFile的最后一个参数不能用dwBlockSize而只能用qwFileSize。 //MapViewOfFile的返回值不能是TCHAR*,因为UNICODE时解释成宽字符,会出错,只能用char* char *lpbMapAddress = (char *)MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, qwFileSize); if (lpbMapAddress == NULL) { cout<<"映射文件映射失败,错误代码: "<<GetLastError()<<endl; return 0; }
string str = GetValue(lpbMapAddress, ("hkx")); cout<<str.c_str()<<endl; getchar();
// 撤销文件映像 UnmapViewOfFile(lpbMapAddress); }
// 关闭文件映射对象句柄 CloseHandle(hFileMap);
return