请教:下载的文件不完整
tuxw 2007-06-26 02:20:23 用下面的代码实现简单的文件下载,下载小文件时比较正常,若下载的文件比较大,则总是下载 600K 左右就出错了。
从没写过网络程序,大家帮忙分析下原因,谢谢!
开始以为是通过 GetLength 的获取文件长度不正确,通过调试知道长度是正确的,还是试着用 QueryInfo 获取文件长,同样下载不完整。
其实网上有很多下载文件的代码,我下了几个例子,直接编译后用来下载实验文件,同样只能下载几百K?
用来实验的文件是:http://tuxw2005.googlepages.com/My3DHelp.zip
代码如下:
PTSTR pstrURL = _T("..."); // 下载地址
PTSTR pstrSaveFileName = _T("..."); // 本地保存文件名
CString strErrMsg; // 错误信息
CInternetSession sess;
CHttpFile *pHttpFile = NULL;
UINT nSaveFlag = CFile::modeCreate | CFile::modeWrite | CFile::typeBinary;
DWORD dwHttpFlag = INTERNET_FLAG_EXISTING_CONNECT
| INTERNET_FLAG_RELOAD
| INTERNET_FLAG_DONT_CACHE
| INTERNET_FLAG_PRAGMA_NOCACHE
| INTERNET_FLAG_TRANSFER_BINARY
;
try
{
sess.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 1000 * 30);
sess.SetOption(INTERNET_OPTION_CONNECT_BACKOFF, 1000);
sess.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 5);
pHttpFile = (CHttpFile *)sess.OpenURL(pstrURL, 1, dwHttpFlag);
if(NULL == pHttpFile)
{
AfxThrowInternetException(1);
}
CStdioFile fout;
if( !fout.Open(pstrSaveFileName, nSaveFlag) )
{
// 打开本地文件错误
pHttpFile->Close();
sess.Close();
return FALSE;
}
DWORD dwLen = pHttpFile->GetLength(); // 文件长度
DWORD dwRead = 0; // 已下载字节
// 下载
#define BUF_LEN 1024 * 8
BYTE tszBuff[BUF_LEN] = {0}; // 缓冲区
UINT nRead = 0;
while( (nRead = pHttpFile->Read(tszBuff, BUF_LEN)) > 0)
{
fout.Write(tszBuff, nRead);
dwRead += nRead;
}
#undef BUF_LEN
// 完成
if(dwRead < dwLen)
{
strErrMsg = _T("下载错误!");
pHttpFile->Close();
sess.Close();
fout.Close();
return FALSE;
}
}
catch(CInternetException *e)
{
TCHAR tszErr[1024];
if(e->GetErrorMessage(tszErr, sizeof(tszErr)))
{
strErrMsg = tszErr;
}
e->Delete();
return FALSE;
}
strErrMsg = _T("下载成功!");
return TRUE;