16,471
社区成员
发帖
与我相关
我的任务
分享
BOOL CMemFileDlg::LoadFile(CString strFileName)
{
HANDLE hFile,hMapping;
void *basePointer;
if((hFile=CreateFile(strFileName,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0))==INVALID_HANDLE_VALUE)
{
AfxMessageBox("没有成功打开文件");
return FALSE;
}
if(!(hMapping=CreateFileMapping(hFile,0,PAGE_READONLY|SEC_COMMIT,0,0,0)))//创建一个文件映射内核对象
{
AfxMessageBox("没有成功创建文件句柄");
CloseHandle(hFile);
return FALSE;
}
if(!(basePointer=MapViewOfFile(hMapping,FILE_MAP_READ,0,0,0)))//将文件数据映射到进程空间
{
AfxMessageBox("没有成功映射");
CloseHandle(hMapping);
CloseHandle(hFile);
return FALSE;
}
CloseHandle(hMapping);
CloseHandle(hFile);
m_strText=(LPSTR)basePointer;
UnmapViewOfFile(basePointer);//从进程空间解除映射
return TRUE;
}
{
HANDLE hFile = CreateFile(
lpszFile,
GENERIC_READ ,// 如果要映射文件:此处必设置为只读(GENERIC_READ)或读写
0, // 此设为打开文件的任何尝试均将失败
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, //|FILE_FLAG_WRITE_THROUGH,
NULL);
if (hFile != INVALID_HANDLE_VALUE)// 文件打开失败返回句柄为-1
{
HANDLE hFileMap = CreateFileMapping(
hFile, // 如果这值为INVALID_HANDLE_VALUE,是合法的,上步一定测试啊
NULL, // 默认安全性
PAGE_READONLY, //只读
0, // 2个32位数示1个64位数,最大文件字节数,
0,//dwFileSize, // 此为低字节,也就是最主要的参数,如果为0,取文件真实大小
NULL);
if (hFileMap != NULL)
{
LARGE_INTEGER dwFileSize = {0};
GetFileSizeEx(hFile, &dwFileSize);
if(pProcInfo)
pProcInfo->uLL_TotalSize = dwFileSize.QuadPart;
LARGE_INTEGER dwOffset = {0};
while(dwOffset.QuadPart < dwFileSize.QuadPart)
{
ULONGLONG partLen = dwFileSize.QuadPart - dwOffset.QuadPart;
UINT4 dwLen = (64 * 1024) * 1024; //64M 64K对齐
if(partLen < dwLen) dwLen = (UINT4)partLen;
LPVOID pvFile = MapViewOfFileEx( //pvFile就是得到的指针,用它来直接操作文件
hFileMap,
FILE_MAP_READ , //读
dwOffset.HighPart, // 文件指针头位置 高字节
dwOffset.LowPart, // 文件指针头位置 低字节 必为分配粒度的整倍数,windows的粒度为64K
dwLen, // 要映射的文件尾,如果为0,则从指针头到真实文件尾
NULL);
if (pvFile != NULL)
{
//do someting whit pvFile and dwLen
UnmapViewOfFile(pvFile); // 释放内存映射文件的头指针
}
else
{
TRACE( _T("MapViewOfFile Error=%d\n"), GetLastError());
}
dwOffset.QuadPart += dwLen; //指向下一段
}
CloseHandle(hFileMap); // 内存映射文件句柄
}
else
{
TRACE( _T("CreateFileMapping Error=%d\n"), GetLastError());
}
CloseHandle(hFile); // 关闭文件
}
else
{
TRACE( _T("CreateFile Error=%d\n"), GetLastError());
}
}
BOOL C**DataSet::SaveData(const CString &sFilePathName,CString &sErrInfo)
{
int nLen = GetDataLen();
HANDLE hFile = CreateFileA(sFilePathName, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if (hFile == INVALID_HANDLE_VALUE)
{
sErrInfo = "文件创建失败。";
return FALSE;
}
HANDLE hMapObject = CreateFileMappingA(hFile, 0, PAGE_READWRITE, 0, nLen,NULL);//m_lFileLen
if (hMapObject == NULL)
{
CloseHandle(hFile);
sErrInfo = "内存映射文件创建失败。";
return FALSE;
}
LPVOID pBase = MapViewOfFile(hMapObject, FILE_MAP_WRITE, 0, 0, 0);
BYTE *pBuf = (BYTE*)pBase;
BYTE nHeadLen = sHead.GetLength();
*pBuf = nHeadLen;
pBuf++;
memcpy(pBuf,sHead,nHeadLen);
pBuf += nHeadLen;
/*此处略去大量的写文件处理*/
BOOL res = FlushViewOfFile(pBase,nLen);
UnmapViewOfFile(pBase);
CloseHandle(hMapObject);
CloseHandle(hFile);
//
return TRUE;
}