消息关闭
    暂无新消息!
如题,读的文件过大的时候,再中途,InternetReadFile会返回错误,然后就下载失败了。

代码如下:
      while (blReadFile && LEN == dwReadFileSize)
    {

        cfile.Write(buf, LEN);
        blReadFile = InternetReadFile(hFile,buf,LEN,&dwReadFileSize);
HaveReadFile += dwReadFileSize;
    }
    if (blReadFile && dwReadFileSize < LEN)
    {
        cfile.Write(buf,dwReadFileSize);
        cfile.Close();
    }
    if (!blReadFile)
    {
        cfile.Close();
        InternetCloseHandle(hFile);
        InternetCloseHandle(hOpen);
        InternetCloseHandle(hConnect);
        
        DeleteFile(strDownloadFileName);

   //     AfxMessageBox(strTip[7]);

        return -1;
    }

8个回答

︿ 2
while (blReadFile && LEN == dwReadFileSize)
你确定是这么写?

"To ensure all data is retrieved, an application must continue to call the InternetReadFile function until the function returns TRUE and the lpdwNumberOfBytesRead parameter equals zero."

如果我没有理解错的话,微软的文档是说,调用 InternetReadFile 直到该函数返回TRUE 并且 dwReadFileSize == 0,你最开始的那个判断逻辑好像不对吧?
︿ 2
我也遇到这样的问题哦,网速慢的时候文件还没下载完成 read的长度为0了,而且文件不大,只能在线程里面继续下载,相当于断点续传
︿ 0
这个代码的逻辑是没有断点续传的,我这边目前出不了这种状况,有别人出现了,网络有问题。
︿ 0
目前这个下载的文件只有200M,而且,这种情况不是必现的,当网络比较慢的时候,有时候会出现这种情况。
︿ 0
InternetReadFile
BOOL InternetReadFile(
    IN HINTERNET hFile,
    IN LPVOID lpBuffer,
    IN DWORD dwNumberOfBytesToRead,
    OUT LPDWORD lpNumberOfBytesRead
);

Reads data from a handle opened by the InternetOpenUrl, FtpOpenFile, GopherOpenFile, or HttpOpenRequest function. 

Returns TRUE if successful, or FALSE otherwise. To get extended error information, callGetLastError. An application can also use InternetGetLastResponseInfo when necessary. 
hFile 
Valid handle returned from a previous call to InternetOpenUrl, FtpOpenFile, GopherOpenFile, or HttpOpenRequest. 
lpBuffer 
Address of a buffer that receives the data read. 
dwNumberOfBytesToRead 
Number of bytes to read. 
lpNumberOfBytesRead 
Address of a variable that receives the number of bytes read. InternetReadFile sets this value to zero before doing any work or error checking. 
If the return value is TRUE and the number of bytes read is zero, the transfer has been completed and there are no more bytes to read on the handle. This is analogous to reaching EOF in a local file. Call InternetCloseHandle to free the connection to the server. 

The buffer pointed to by lpBuffer is not always filled by calls to InternetReadFile (sufficient data might not have arrived from the server). When reading HTML data, for the first read posted, the buffer must be large enough to hold the HTML headers. When reading HTML-encoded directory entries, the buffer must be large enough to hold at least one complete entry. 

When the item being read is also being cached by a Win32 Internet function, the application must ensure that a read is made for end-of-file so the cache file is committed correctly. 

This function always fulfills the user's request. If more data is requested than is available, the function waits until enough data to complete the request is available. The only time that less data is returned than requested is when the end of the file has been reached. 

This function can also be used to retrieve FTP and Gopher directory listings as an HTML document on a handle opened by InternetOpenUrl. The INTERNET_FLAG_RAW_DATA value must not have been specified in the call to InternetOpenUrl. 

If the HINTERNET handle stored in hFile was created by HttpOpenRequest and sent by HttpSendRequestEx, a call to HttpEndRequest must be made on the handle before InternetReadFile is used. 
︿ 0
没准文件大小超过2G或4G时,dwReadFileSize等变量不足以保存文件实际长度。