18,356
社区成员
发帖
与我相关
我的任务
分享
UINT ThreadFunc(LPVOID lpParam)
{
CInternetSession sess;
CHttpFile* fileGet = NULL;
CString strSave;
int n=0,m=0;
char buf[1024];
DWORD dwStatus;
DWORD dwBuffLen;
CStdioFile fileWrite;
CFileStatus status;
BOOL bSuccess;
int i = iDowning;
while (bStart)
{
critical_section.Lock();//锁定线程
if (iStep < iNum)
{
arrUrl[i] = arrUrl[iStep];
arrOutFile[i] = arrOutFile[iStep];
iStep++;
}
else
{
arrUrl[i] = "";
arrOutFile[i] = "";
list1->SetItemText(i,0,"");
critical_section.Unlock();//解锁线程
break;
}
critical_section.Unlock();//解锁线程
//////////////////////////////////////////////////////////////////////////
if (arrUrl[i] != "")
{
if (CFile::GetStatus(arrOutFile[i],status)) //获得目标文件状态
{
bSuccess = false;
if (bSize)
{InternetSetOption
if(status.m_size == (long)GetPrivateProfileInt("下载记录",(arrOutFile[i].Right(arrOutFile[i].GetLength()-1-arrOutFile[i].ReverseFind('\\'))),-1,strSettingPath))
{
list1->SetItemText(i,2,":文件存在");
Sleep(200);
}
else
bSuccess = true;
}
}
else
{
bSuccess = true;
}
if (bSuccess)
{
bSuccess = false;
/************************************************************************/
/* 开始下载 */
/************************************************************************/
list1->SetItemText(i,1,arrUrl[i]);
list1->SetItemText(i,2,":文件连接");
try
{
list1->SetItemText(i,2,":开始分析");
fileGet=(CHttpFile*)sess.OpenURL(LPCTSTR(arrUrl[i]));
if (fileGet != NULL)
{
list1->SetItemText(i,2,":分析文件");
dwBuffLen = sizeof(dwStatus);
bSuccess = fileGet->QueryInfo(HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, &dwStatus, &dwBuffLen);
if( bSuccess && dwStatus>= 200 && dwStatus<300 )
{
list1->SetItemText(i,2,":返回消息");
//获得文件长度
fileGet->QueryInfo(HTTP_QUERY_FLAG_NUMBER|HTTP_QUERY_CONTENT_LENGTH, &dwStatus, &dwBuffLen);
//保存长度
list1->SetItemText(i,2,":获得长度");
critical_section.Lock();//锁定线程
strSave.Format("%ld",dwStatus);
WritePrivateProfileString("下载记录",(arrOutFile[i].Right(arrOutFile[i].GetLength()-1-arrOutFile[i].ReverseFind('\\'))),strSave,strSettingPath);
list1->SetItemText(i,2,":保存长度");
critical_section.Unlock();//锁定线程
list1->SetItemText(i,2,":开始下载");
if(fileWrite.Open(arrOutFile[i], CFile::modeWrite|CFile::modeCreate|CFile::typeBinary))
{
m = 0;
iOpen++;
while((n = fileGet->Read(buf,sizeof(buf))) > 0)
{
fileWrite.Write(buf,n);
m += n;
iSpeek += n;
strSave.Format(":%d %c",int(m*100/dwStatus),'%');
list1->SetItemText(i,2,strSave);
Sleep(5);
}
fileWrite.Close();
iOpen--;
}
/************************************************************************/
/* 下载结束 */
/************************************************************************/
CFile::GetStatus(arrOutFile[i],status);
if(status.m_size != (long)dwStatus)
{
arrError.Add(arrUrl[i]);
iError++;
}
}
}
else
{
list1->SetItemText(i,2,":文件连接失败");
Sleep(200);
}
}
catch (CInternetException * e)
{
char strErr[256];
e->GetErrorMessage(strErr,sizeof(strErr));
list1->SetItemText(i,2,strErr);
e->Delete();
fileGet = NULL;
}
}
list1->SetItemText(i,1,"");
list1->SetItemText(i,2,"");
}
else
break;
::PostMessage(AfxGetMainWnd()->m_hWnd,WM_MYDO,NULL,NULL);
}
list1->SetItemText(i,0,"");
if (fileGet != NULL)
{
fileGet->Close();
}
if (sess != NULL)
{
sess.Close();
}
delete fileGet;
iDowning--;
return 1;
}