下面的程序是对大文件的分割,但在分割几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("分割成功!");
__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("分割成功!");
解决方案 »
- 为嘛ListBox控件一直收不到LBN_SELCHANGE消息
- 求教各位大侠!从驱动中获取VID和PID!!
- 串口通信和网络通信在一起的时候收不到消息?
- 怎么用POP3命令标识一封新邮件??
- 消息不见了,真是气死人!
- 用MoveWindow()设置single document程序主窗口的初始大小,虽然可以用指定的大小来显示主窗口,但为什么会"闪"一下?怎么改正呢?
- [VC新手]求教关于绘图
- 98/me下如何禁止拨号连接老是弹出要求输入用户名和密码的那个窗口?
- 瑞星说我的机器有病毒,请问这是什么病毒
- 不建立非模式对话框就不能实现隐藏对话框吗???
- 求助:数据传递
- COM中调用STL的map.erase()出错??
si.dwAllocationGranularity是很小的,频繁map并且你频繁flush是不是会出问题,去掉每次的flush试试。如果你就是一个单纯的文件分割就不要用内存映射了,直接文件操作很少几行代码就能搞定。这样做反而给自己添麻烦。