下面的程序是对大文件的分割,但在分割几G以上的文件时,就出现错误,错误码为8,说是内存不足,但我是一次只映射一小部分来处理的,当处理完后再映射的。不知是哪的问题,是不是内存泄漏得太严重而出现的问题还是怎么的?贴出核心部分代码,代码比较长~~先谢谢了 HANDLE hFile,hFile1,hFile2,hMap,hMap1;
__int64 dwFileSize=0,dwoffset=0;
__int64 dwSize1=0,dwSize2=0,state=0;
DWORD dwSizeH=0,dwSizeL=0,dwBytes=0;
byte *bp=NULL,*p=NULL;
SYSTEM_INFO si;
GetSystemInfo(&si);//获取系统信息
CString filename=m_ShowList.GetItemText(0,0);//要分割的文件
CString SaveAs="";
GetDlgItem(IDC_ShowSaveAs)->GetWindowText(SaveAs);
if(filename==""||SaveAs=="")
{
AfxMessageBox("分割文件失败11!");
return;
}
CString file=filename.Right(filename.GetLength()-filename.ReverseFind('\\')-1);
CString tfile=file.Left(file.ReverseFind('.'));
CString ext=file.Right(file.GetLength()-file.ReverseFind('.')-1);
if(tfile=="")
{
AfxMessageBox("分割文件失败22!");
return;
}
CString file1=SaveAs+"\\"+tfile+"-1"+".Smile";//分割后的第一个文件
CString file2=SaveAs+"\\"+tfile+"-2"+".Smile";//分割后的第二个文件
hFile=CreateFile((LPCTSTR)filename.GetBuffer(0),
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hFile==INVALID_HANDLE_VALUE)
{
AfxMessageBox("分割文件失败!原因是想分割的文件不存在!");
CloseHandle(hFile);
return;
}
dwSizeL=GetFileSize(hFile,&dwSizeH);
dwFileSize=(__int64)dwSizeL;
dwFileSize+=((__int64)(dwSizeH<<32));
if(dwFileSize<=si.dwAllocationGranularity)
{
AfxMessageBox("文件太小,不用分割!");
return;
}
hFile1=CreateFile((LPCTSTR)file1.GetBuffer(0),
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
CREATE_NEW,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hFile1==INVALID_HANDLE_VALUE)
{
AfxMessageBox("分割文件失败!原因是目标文件已经存在!");
CloseHandle(hFile1);
return;
}
hFile2=CreateFile((LPCTSTR)file2.GetBuffer(0),
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
CREATE_NEW,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hFile2==INVALID_HANDLE_VALUE)
{
AfxMessageBox("分割文件失败!原因是目标文件已经存在!");
CloseHandle(hFile2);
return;
}
hMap=CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);
if(hMap==NULL)
{
AfxMessageBox("分割文件失败!创建文件映像失败!");
CloseHandle(hFile);
CloseHandle(hMap);
return;
}
CloseHandle(hFile);
__int64 temp=dwFileSize/(si.dwAllocationGranularity); dwSize1=((temp+1)/2)*(si.dwAllocationGranularity);//使第一个文件的基址或偏移对齐
dwSize2=dwFileSize-dwSize1; hMap1=CreateFileMapping(hFile1,NULL,PAGE_READWRITE,(DWORD)(dwSize1>>32),(DWORD)(dwSize1&0XFFFFFFFF),NULL);
if(hMap1==NULL)
{
AfxMessageBox("分割文件失败!创建文件映像失败!");
CloseHandle(hMap1);
return;
}
int j=0;
while(dwSize1>0)
{
if(dwSize1<si.dwAllocationGranularity)
dwBytes=(DWORD)dwSize1;
else
dwBytes=si.dwAllocationGranularity;     bp=(byte*)MapViewOfFile(hMap,FILE_MAP_READ,(DWORD)(dwoffset>>32),(DWORD)(dwoffset&0xFFFFFFFF),dwBytes);
    if(bp==NULL)
{
  char buf[100]="\0";
  wsprintf(buf,"分割文件失败11,错误码:%d",GetLastError());
  AfxMessageBox(CString(buf));
  CloseHandle(hMap);
  return;
}
    p=(byte*)MapViewOfFile(hMap1,FILE_MAP_WRITE,(DWORD)(dwoffset>>32),(DWORD)(dwoffset&0xFFFFFFFF),dwBytes);
   for(j=0;j<(int)dwBytes;j++)
   {
  p[j]=bp[j];
  state++;
   }
   dwSize1-=dwBytes;
   dwoffset+=dwBytes;
   FlushViewOfFile((LPCVOID)bp,dwBytes);
   UnmapViewOfFile(p);
   UnmapViewOfFile(bp);
}
CloseHandle(hFile1);
CloseHandle(hMap1);

hMap1=CreateFileMapping(hFile2,NULL,PAGE_READWRITE,(DWORD)(dwSize2>>32),(DWORD)(dwSize2&0XFFFFFFFF),NULL);
if(hMap1==NULL)
{
AfxMessageBox("分割文件失败!创建文件映像失败!");
CloseHandle(hMap1);
return;
}
__int64 dwoffset1=0;
while(dwSize2>0)
{
if(dwSize1<si.dwAllocationGranularity)
dwBytes=(DWORD)dwSize2;
else
dwBytes=si.dwAllocationGranularity;
    bp=(byte*)MapViewOfFile(hMap,FILE_MAP_READ,(DWORD)(dwoffset>>32),(DWORD)(dwoffset&0xFFFFFFFF),dwBytes);
    if(bp==NULL)
{
  char buf[100]="\0";
  wsprintf(buf,"分割文件失败22,错误码:%d",GetLastError());
  AfxMessageBox(CString(buf));
  CloseHandle(hMap);
  return;
}

    p=(byte*)MapViewOfFile(hMap1,FILE_MAP_WRITE,(DWORD)(dwoffset1>>32),(DWORD)(dwoffset1&0xFFFFFFFF),dwBytes);
    for(j=0;j<(int)dwBytes;j++)
{
    p[j]=bp[j];
}
dwSize2-=dwBytes;
dwoffset+=dwBytes;
dwoffset1+=dwBytes;
    FlushViewOfFile((LPCVOID)bp,dwBytes);
    UnmapViewOfFile(p);
UnmapViewOfFile(bp);
}
CloseHandle(hFile2);
CloseHandle(hMap1);
AfxMessageBox("分割成功!");