请教高手关于文件下载的问题!(附代码)
小弟VC初学,碰到一个文件下载的问题,望大虾不吝赐教!
int nRetCode = 0;
CInternetSession objSession;
CHttpConnection* pServer = NULL;
CHttpFile* pFile = NULL;
try
{
UpdateData();
pszURL = m_URL;
CString strServerName;
CString strObject;
CString strFilePath;
INTERNET_PORT nPort;
DWORD dwServiceType;
UINT nBytesRead = 1;
DWORD nFileSize = 0;
//Parse the URL ...
if (AfxParseURL(pszURL, dwServiceType, strServerName, strObject, nPort) &&
dwServiceType == INTERNET_SERVICE_HTTP)
{
//Connect a web server ...
pServer = objSession.GetHttpConnection(strServerName, nPort);
pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET,
strObject, NULL, 1, NULL, NULL, dwHttpRequestFlags);
pFile->AddRequestHeaders(szHeaders);
pFile->SendRequest();
DWORD dwRet;
pFile->QueryInfoStatusCode(dwRet);
if (dwRet == HTTP_STATUS_OK) {
//Find a valid file ...
CFileDialog objDLG(false, "*", pFile->GetFileName());;
objDLG.DoModal();
strFilePath = objDLG.GetPathName();
//问题1
//无论用CInternetFile的GetLength()方法,还是用InternetQueryDataAvailable
//都无法得到大文件的大小,小文件则可以
nFileSize = pFile->GetLength();
InternetQueryDataAvailable(pFile, &nFileSize, 0, 0);
CString szBuffer;
CFile tmpFile(strFilePath, CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite);
CArchive ar(&tmpFile, CArchive::store);
long nSize = 0;
//Read file from web server ...
//问题2,ReadString以文件流的形式一行一行的从web server上读取
//小文件无问题,大文件有时候读不全
while (pFile->ReadString(szBuffer)) {
ar << szBuffer;
nSize += szBuffer.GetLength();
}
ar.Close();
tmpFile.Close();
pFile->Close();
}
}
}
catch (CInternetException* pEx)
{
TCHAR szErr[1024];
pEx->GetErrorMessage(szErr, 1024);
nRetCode = 2;
pEx->Delete();
}
综上所述,下载大文件总会碰到很多问题!谁有经验,请帮帮忙
Socket编程比较麻烦,碰到的问题可能会更多,而且关于http代理不好解决
wininet还是比较方便的,但是没我想象的那么有效