麻烦各位看下,我用内存映射的方式来合并文件,为什么在第二次while循环中调用
LPBYTE lpMapAllAdress = (LPBYTE)MapViewOfFile(hFileMapAll,FILE_MAP_ALL_ACCESS,(DWORD)(i64Offset >> 32), (DWORD)(i64Offset & 0xFFFFFFFF),dwBytesInBlock);时不成功,lpMapAllAdress为空。
#define MAKEINT64(a,b) ((LONG64)(DWORD)(a)|(LONG64)(DWORD)(b)<<32)
LONG64 GetFileSizeEx(CString strFileName)
{
WIN32_FIND_DATA infoFile;
HANDLE hFile = FindFirstFile(strFileName,&infoFile);
if (INVALID_HANDLE_VALUE == hFile)
{
return -1;
} FindClose(hFile);
return MAKEINT64(infoFile.nFileSizeLow,infoFile.nFileSizeHigh);
} CString strFile1 = "d:\\20110611174036_1.AVI";
CString strFile2 = "d:\\20110611183040_1.AVI";
// TODO: Add your control notification handler code here
LONG64 i64FileSize1 = GetFileSizeEx(strFile1);
LONG64 i64FileSize2 = GetFileSizeEx(strFile2);
if (i64FileSize1==-1|| i64FileSize2 == -1)
{
return;
}
SYSTEM_INFO sinf;
HANDLE hFile_All = CreateFile("D:\\Merge.avi",GENERIC_READ|GENERIC_WRITE,0,NULL,CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,NULL); HANDLE hFileMapAll = CreateFileMapping(hFile_All, NULL, PAGE_READWRITE,
DWORD)((i64FileSize1 + i64FileSize2) >> 32),(DWORD)((i64FileSize1 + i64FileSize2)&0xFFFFFFFF), NULL);
if (hFileMapAll == NULL)
{
CloseHandle(hFile_All);
return;
}
CloseHandle(hFile_All);
GetSystemInfo(&sinf);
DWORD dwGran = sinf.dwAllocationGranularity;
HANDLE hFile1 = CreateFile (strFile1,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,NULL);
HANDLE hFileMapping1 = CreateFileMapping(hFile1,NULL,PAGE_READONLY,0,0,NULL);
HANDLE hFile2 = CreateFile(strFile2,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,NULL);
HANDLE hFileMapping2 = CreateFileMapping(hFile2,NULL,PAGE_READONLY,0,0,NULL);
DWORD dwFileSizeHigh1 = 0;
LONG64 qwFileSize1 = GetFileSize(hFile1,&dwFileSizeHigh1);
qwFileSize1 +=(((LONG64)dwFileSizeHigh1)<<32);
__int64 i64Offset = 0;
while (qwFileSize1>0)
{
DWORD dwBytesInBlock = sinf.dwAllocationGranularity;
if (qwFileSize1 < sinf.dwAllocationGranularity)
{
dwBytesInBlock = (DWORD) qwFileSize1;
} LPBYTE lpMapAllAdress = (LPBYTE)MapViewOfFile(hFileMapAll,FILE_MAP_ALL_ACCESS,(DWORD)(i64Offset >> 32), (DWORD)(i64Offset & 0xFFFFFFFF),dwBytesInBlock);
LPBYTE lpMapAddress1 = (LPBYTE) MapViewOfFile(hFileMapping1,FILE_MAP_READ,(DWORD)(i64Offset >> 32), (DWORD)(i64Offset & 0xFFFFFFFF),dwBytesInBlock); memcpy((void*)lpMapAllAdress,(void*)lpMapAddress1,dwBytesInBlock);
UnmapViewOfFile(lpMapAddress1);
UnmapViewOfFile(lpMapAllAdress);
i64Offset += dwBytesInBlock;
qwFileSize1-=dwBytesInBlock;
}
CloseHandle(hFileMapping1);
CloseHandle(hFile1);
DWORD dwFileSizeHigh2 = 0;
LONG64 qwFileSize2 = GetFileSize(hFile2,&dwFileSizeHigh2);
qwFileSize2 +=(((LONG64)dwFileSizeHigh2)<<32);
__int64 i64Offset2 = 0;
while (qwFileSize2>0)
{
DWORD dwBytesInBlock = sinf.dwAllocationGranularity;
if (qwFileSize2 < sinf.dwAllocationGranularity)
{
dwBytesInBlock = (DWORD) qwFileSize2;
}
LPBYTE lpMapAllAdress = (LPBYTE)MapViewOfFile(hFileMapAll,FILE_MAP_ALL_ACCESS,(DWORD)(i64Offset >> 32), (DWORD)(i64Offset & 0xFFFFFFFF),dwBytesInBlock);
LPBYTE lpMapAddress2 = (LPBYTE) MapViewOfFile(hFileMapping2,FILE_MAP_READ,(DWORD)(i64Offset2 >> 32), (DWORD)(i64Offset2 & 0xFFFFFFFF),dwBytesInBlock);
memcpy((void*)lpMapAllAdress,(void*)lpMapAddress2,dwBytesInBlock);
UnmapViewOfFile(lpMapAddress2);
UnmapViewOfFile(lpMapAllAdress);
i64Offset += dwBytesInBlock;
i64Offset2 += dwBytesInBlock;
qwFileSize2-=dwBytesInBlock;
}
CloseHandle(hFileMapping2);
CloseHandle(hFile2);
CloseHandle(hFileMapAll);
CloseHandle(hFile_All);
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货