代码如下:
HANDLE hFile = CreateFile(lpszFileName,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
0,
NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
return FALSE;
ULARGE_INTEGER uliSize;
uliSize.LowPart = GetFileSize(hFile, &uliSize.HighPart);
m_hFileMapping= CreateFileMapping(hFile,NULL,PAGE_READONLY, uliSize.HighPart, uliSize.LowPart, "BigFile");
if (m_hFileMapping==NULL)
{
CloseHandle(hFile);
return FALSE;
}
m_pbFile = (LPBYTE)MapViewOfFile(m_hFileMapping, FILE_MAP_READ, 0, 0, 0);
if (m_pbFile == NULL)
{
CloseHandle(hFile);
CloseHandle(m_hFileMapping);
return FALSE;
}
m_pbData = m_pbFile;
m_llSize = (LONGLONG)uliSize.QuadPart;
CloseHandle(hFile);有时候映射文件时MapViewOfFile出错,并不是每次出错!!!
请大家帮我解决!!!!!!!!!!!!!!
HANDLE hFile = CreateFile(lpszFileName,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
0,
NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
return FALSE;
ULARGE_INTEGER uliSize;
uliSize.LowPart = GetFileSize(hFile, &uliSize.HighPart);
m_hFileMapping= CreateFileMapping(hFile,NULL,PAGE_READONLY, uliSize.HighPart, uliSize.LowPart, "BigFile");
if (m_hFileMapping==NULL)
{
CloseHandle(hFile);
return FALSE;
}
m_pbFile = (LPBYTE)MapViewOfFile(m_hFileMapping, FILE_MAP_READ, 0, 0, 0);
if (m_pbFile == NULL)
{
CloseHandle(hFile);
CloseHandle(m_hFileMapping);
return FALSE;
}
m_pbData = m_pbFile;
m_llSize = (LONGLONG)uliSize.QuadPart;
CloseHandle(hFile);有时候映射文件时MapViewOfFile出错,并不是每次出错!!!
请大家帮我解决!!!!!!!!!!!!!!
你看看m_hFileMapping返回值信息~~
{
HANDLE hMapping;
LPSTR lpData;
HANDLE hOpenFile;
BOOL bRet; // 1. open file with handle
cout << "open file:" << (LPCTSTR)FileName << endl;
hOpenFile = CreateFile((LPCTSTR)FileName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS,
0
);
if(hOpenFile == INVALID_HANDLE_VALUE)
{
cout << "open file:" << (LPCTSTR)FileName << " failure, reason:" << GetLastError() << endl;
return -1;
}
DWORD dwFileSize = GetFileSize(hOpenFile, NULL); // 2. Read file
cout << "read file" << endl;
char szWavHead[256] = { 0 };
DWORD nReadBytes = sizeof(szWavHead);
bRet = ReadFile(hOpenFile, szWavHead, nReadBytes, &nReadBytes, NULL);
if(!bRet)
{
cout << "Read file failure, reason :" << GetLastError() << endl;
CloseHandle(hOpenFile);
return -2;
} // 2. map memory file
cout << "create file map" << endl;
hMapping = CreateFileMapping(hOpenFile, NULL, PAGE_READWRITE, 0, dwFileSize + sizeof(wave_file_head), NULL);
if(hMapping == NULL)
{
cout << "CreateFileMapping() failed, reason: " << GetLastError() << endl;
return -2;
} lpData = (LPSTR)MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if(!lpData)
{
cout << "MapViewOfFile() failed reason: " << GetLastError() << endl;
return -3;
} // 3. move memory
cout << "move memory" << endl;
memmove(lpData + sizeof(wave_file_head), lpData, dwFileSize); // 4. write header
memcpy(lpData, "This is a test", 14); // 5. Unmap file, close handle
cout << "unmap file" << endl;
UnmapViewOfFile(lpData);
CloseHandle(hOpenFile);
//Sleep(2000); return TRUE;
}
GetFileSize,HighPart= 0 LowPart= 232203939
CreateFileMapping
MapViewOfFile
MapViewOfFile失败=8
LoadFile=失败
OPENFILE=End
我的内存是512M,C:3G多空闲,上面是跟踪结果!
m_hFileMapping= CreateFileMapping(hFile,NULL,PAGE_READONLY, 0, 0, NULL);
if (m_hFileMapping == NULL)
{
CloseHandle(hFile);
return FALSE;
}
CloseHandle(hFile);
SYSTEM_INFO SysInfo;
GetSystemInfo(&SysInfo);
DWORD dwGran = SysInfo.dwAllocationGranularity; DWORD dwFileSizeHigh;
__int64 qwFileSize = GetFileSize(hFile, &dwFileSizeHigh);
qwFileSize |= (((__int64)dwFileSizeHigh) << 32); __int64 qwFileOffset = 0;
DWORD dwBlockBytes = 1000 * dwGran;
if (uliSize.QuadPart < 1000 * dwGran)
dwBlockBytes = (DWORD)uliSize.QuadPart;
while (qwFileOffset > 0)
{
LPBYTE m_pbFile = (LPBYTE)MapViewOfFile(m_hFileMapping,FILE_MAP_READ,
(DWORD)(qwFileOffset >> 32), (DWORD)(qwFileOffset & 0xFFFFFFFF),dwBlockBytes);
if (m_pbFile == NULL)
{
CString s;
s.Format("MapViewOfFile失败=%d",GetLastError());
LogMsg(s);
CloseHandle(hFile);
CloseHandle(m_hFileMapping);
return FALSE;
}
memmove(m_pbData, m_pbFile, dwBlockBytes);
UnmapViewOfFile(m_pbFile);
qwFileOffset += dwBlockBytes;
qwFileSize -= dwBlockBytes;
}
m_pbData = m_pbFile;
m_llSize = (LONGLONG)uliSize.QuadPart;
CloseHandle(m_hFileMapping);
(DWORD)(qwFileOffset >> 32), (DWORD)(qwFileOffset & 0xFFFFFFFF),dwBlockBytes);
=================
完全没有必要用什么高位字节啊,你的文件最大也不过200多兆而已,32位的int最大可以有4GB。还有这个“
CloseHandle(hFile);
SYSTEM_INFO SysInfo;
GetSystemInfo(&SysInfo);
DWORD dwGran = SysInfo.dwAllocationGranularity;DWORD dwFileSizeHigh;
__int64 qwFileSize = GetFileSize(hFile, &dwFileSizeHigh);”应该有问题,既然hFile已经关闭,你再取得的GetFileSize你注意过没有,应该是一个无效值。
我的建议是不要搞什么高WORD,__int64的,一律用DWORD的一个低字就可以解决。具体你可以参考一下我上面的那个例子改写一下即可。