请教关于URLDownloadToFile下载文件的问题(100分)

  • 主题发起人 主题发起人 yqlqq
  • 开始时间 开始时间
Y

yqlqq

Unregistered / Unconfirmed
GUEST, unregistred user!
我用以下代码下载网站的多个文件:
sFile := 'C:/Test.htm' ;
For i := 1 To 1000 Do
Begin
sURL := 'http://xxx.xxx.com/show.asp?id=' + IntToStr(i) ;
URLDownloadToFile(nil, PChar(sURL), PChar(sFile), 0, nil) ;
If FileExists(sFile) Then
…………
DeleteFile(sFile) ;
End ;

一开始运行的时间是很正常的,可循环了几十次后,执行URLDownloadToFile后就根本找不到sFile文件,把程序退出来再运行,又正常了,但也是只能正常循环几十次,这问题折腾了我两天啦,郁闷啊!
这到底是URLDownloadToFile本身的问题还是我的代码有问题呀,恳请各位高手指点指点,谢谢!
 
虽然代码的逻辑有些诡异,但是用URLDownloadToFile有三个问题需要注意
1.0字节文件不会下载和一些比较特殊的文件(取决于IE的安全性设定)
2.下载时先判断IE缓存是否有相同文件,如果有就直接复制过来而不是通过URL下载。
3.一下子执行多次下载,(我用的是线程,大概是1000个左右)会有1-6个左右的文件会下载失败。
 
用IdHttp吧!
 
TO:Rainstorey
1、确保每一个URL都是有效的,也能用URLDownloadToFile单独下载。
2、如何操作IE缓存呢?
3、我也是用多线程操作,但每个线程的URLDownloadToFile都只能循环下载几十个文件,之后就下载不了啦。

TO:Johnny_du
我尝试过用Indy10的IDHttp,但取不回任何的数据,可能是URL的网页文件格式有限制。
 
应该不会吧?我做过用IdHttp下载文件的程序的,可以的
 
我以前也是一直都用IdHttp做得,但确实有些页面下载回来是空的。
 
没次下载前先清空IE缓存。具体代码可检索。
 
请问Rainstorey大大,怎么样才能清空IE缓存呀,给点代码可以吗,谢谢啦!
 
uses WinInet;
procedure DeleteIECache;
var
lpEntryInfo:PInternetCacheEntryInfo;
hCacheDir:LongWord;
dwEntrySize:LongWord;
begin
dwEntrySize:=0;
FindFirstUrlCacheEntry(nil,TInternetCacheEntryInfo(nil^),dwEntrySize);
GetMem(lpEntryInfo,dwEntrySize);
if dwEntrySize>0 then lpEntryInfo^.dwStructSize:=dwEntrySize;
hCacheDir:=FindFirstUrlCacheEntry(nil,lpEntryInfo^,dwEntrySize);
if hCacheDir<>0 then
begin
repeat
DeleteUrlCacheEntry(lpEntryInfo^.lpszSourceUrlName);
FreeMem(lpEntryInfo,dwEntrySize);
dwEntrySize:=0;
FindNextUrlCacheEntry(hCacheDir,TInternetCacheEntryInfo(nil^),dwEntrySize);
GetMem(lpEntryInfo,dwEntrySize);
if dwEntrySize>0 then lpEntryInfo^.dwStructSize:=dwEntrySize;
until not FindNextUrlCacheEntry(hCacheDir,lpEntryInfo^,dwEntrySize);
end;
FreeMem(lpEntryInfo,dwEntrySize);
FindCloseUrlCache(hCacheDir);
end;
 
非常感谢Rainstorey的帮助,但是执行了你的这个过程后,问题还是一样存在啊。还有没有别的办法呢?
 
在loop中breakpoint具体观察。
 
我已经单步看过了,开始很正常,但循环了几十次后,执行URLDownloadToFile就不能生成sFile文件,但没有错误返回。
 
它可能是异步的;加入等待完成时间看;
 
我加入了1到10秒的待时间测试过,还是不行,再加的话就没意思了。
 
判断一下失败类型然后重试呢?
 
没有返回失败啊,但也没有写文件,FileExists(sFile)返回False
 
改成这样试一下,看是什么效果。
sFile := 'C:/Test.htm' ;
For i := 1 To 1000 Do
Begin
sURL := 'http://xxx.xxx.com/show.asp?id=' + IntToStr(i) ;
try
if URLDownloadToFile(nil, PChar(sURL), PChar(sFile), 0, nil) then
begin
If FileExists(sFile) Then
…………
DeleteFile(sFile) ;
end
else ShowMessage('下载失败!sURL='+sURL+#13#10+'sFile='+sFile);
except
ShowMessage('下载出错!sURL='+sURL+#13#10+'sFile='+sFile);
end;
End ;
 
我也遇到了一个这样的问题:
要下载一个200M的文件,就是不能下载完全,每次下载的文件数量不等。为什么?
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
916
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部