点对点多线程断点续传的实现
2010-01-09 20:31:56 来源:WEB开发网下面介绍开始方法:
//开始方法
int cdownload::startask(int n)
{
//读入文件长度
doinfo.filelen=zmfile[n].length;
//读入名字
fname=zmfile [n].name;
CString tmep;
//初使化文件名
tmep.Format ("\\temp\\%s",fname);
//给主函数发消息
CString aaa;
aaa="正在读取 "+fname+" 信息,马上开始下载。。。\n";
AfxGetMainWnd()->SendMessageToDescendants(WM_AGE1,(LPARAM)aaa.GetBuffer(0),1);
aaa.ReleaseBuffer();
//如果文件长度小于0就返回
if(doinfo.filelen<=0) return -1;
//建一个以.down结尾的文件记录文件信息
CString m_temp;
m_temp=fname+".down";
doinfo.name=m_temp;
FILE* fp=NULL;
CFile myfile;
//如果是第一次下载文件,初使化各记录文件
if((fp=fopen(m_temp,"r"))==NULL){
filerange[0]=0;
//文件分块
for(int i=0;i<BLACK;i++)
{
if(i>0)
filerange[i*2]=i*(doinfo.filelen/BLACK+1);
filerange[i*2+1] =doinfo.filelen/BLACK+1;
}
filerange[BLACK*2-1]=doinfo.filelen-filerange [BLACK*2-2];
myfile.Open(m_temp,CFile::modeCreate|CFile::modeWrite | CFile::typeBinary);
//写入文件长度
myfile.Write (&doinfo.filelen,sizeof(int));
myfile.Close();
CString temp;
for(int ii=0;ii<BLACK;ii++){
//初使化各进程记录文件信息(以.downN结尾)
temp.Format(".down%d",ii);
m_temp=fname+temp;
myfile.Open(m_temp,CFile::modeCreate|CFile::modeWrite | CFile::typeBinary);
//写入 各进程文件信息
myfile.Write(&filerange[ii*2],sizeof(int));
myfile.Write(&filerange[ii*2+1],sizeof(int));
myfile.Close();
}
((CMainFrame*)::AfxGetMainWnd())->m_work.m_ListCtrl->AddItemtwo (n,2,0,0,0,doinfo.threadno);
}
else{
//如果文件已存在,说明是续 传,读上次信息
CString temp;
m_temp=fname+".down0";
if((fp=fopen(m_temp,"r"))==NULL)
return 1;
else fclose (fp);
int bb;
bb=0;
//读各进程记录的信息
for(int ii=0;ii<BLACK;ii++)
{
temp.Format(".down%d",ii);
m_temp=fname+temp;
myfile.Open(m_temp,CFile::modeRead | CFile::typeBinary);
myfile.Read(&filerange[ii*2],sizeof(int));
myfile.Read(&filerange[ii*2+1],sizeof(int));
myfile.Close();
bb = bb+filerange[ii*2+1];
CString temp;
}
if(bb==0) return 1;
doinfo.totle=doinfo.filelen-bb;
((CMainFrame*)::AfxGetMainWnd())->m_work.m_ListCtrl->AddItemtwo (n,2,doinfo.totle,1,0,doinfo.threadno);
}
//建立下载结束进程timethread ,以管现各进程结束时间。
DWORD dwthread;
::CreateThread (NULL,0,timethread,(LPVOID)this,0,&dwthread);
return 0;
}
更多精彩
赞助商链接