windows – 如何通过HTTP从Internet检索文件?

前端之家收集整理的这篇文章主要介绍了windows – 如何通过HTTP从Internet检索文件?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想从Internet下载文件,InternetReadFile乍一看似乎是一个很好的简单解决方案.实际上,太好了,不可能.实际上,挖掘一下我已经开始看到它实际上存在很多问题.使用此代码时,人们会抱怨所有类型的问题.

出现问题是因为:

>应用程序暂时冻结,直到HTTP服务器响应
>由于Internet连接中断,应用程序暂时冻结
>应用程序锁定,因为HTTP服务器永远不会响应
> InternetOpen(我刚刚发现这个)必须在应用程序生命周期内只调用一次

我找不到一个关于如何正确和稳健地使用它的完整示例.有没有人知道如何在一个单独的线程中实现它并且超时?还有另一种简单的方法可以从Internet健壮地下载文件.虽然我不想让像Jedi甚至Indy这样的大型图书馆复杂化我的生活.

function GetFileHTTP (const fileURL,FileName: String): boolean;
CONST
  BufferSize = 1024;
VAR
  hSession,hURL: HInternet;
  Buffer: array[1..BufferSize] of Byte;
  BufferLen: DWORD;
  f: File;
  sAppName: string;
begin
//  result := false;
 sAppName := ExtractFileName(Application.ExeName) ;
 hSession := InternetOpen(PChar(sAppName),INTERNET_OPEN_TYPE_PRECONFIG,nil,0) ;  { be aware that InternetOpen  need only be called once in your application!!!!!!!!!!!!!! }
 TRY
  hURL := InternetOpenURL(hSession,PChar(fileURL),0) ;
  TRY
   AssignFile(f,FileName) ;
   Rewrite(f,1) ;
   REPEAT
    InternetReadFile(hURL,@Buffer,SizeOf(Buffer),BufferLen);
    BlockWrite(f,Buffer,BufferLen)
   UNTIL BufferLen = 0;
   CloseFile(f) ;
   Result:= True;
  FINALLY
   InternetCloseHandle(hURL)
  end
 FINALLY
  InternetCloseHandle(hSession)
 END;
END;

编辑:
功能检查Internet连接是否可用.它似乎也适用于Win98.

{  Are we connected to the Internet? }
function IsConnectedToInternet: Boolean;                                        { Call SHELL32.DLL for Win < Win98 otherwise call URL.dll }
var InetIsOffline: function(dwFlags: DWORD): BOOL; stdcall;
begin
 Result:= FALSE;
 if IsApiFunctionAvailable('URL.DLL','InetIsOffline',@InetIsOffline)
 then Result:= NOT InetIsOffLine(0)
 else
   if IsApiFunctionAvailable('SHELL32.DLL',@InetIsOffline)
   then Result:= NOT InetIsOffLine(0)
end;

我正在使用Delphi 7.非常感谢.

编辑:

由于应用程序在首次启动时挂起而失去客户是亏本的完美配方.

编写代码依赖于Microsoft平台是很糟糕的.您永远不知道客户是否安装了IE版本x.x.

将东西安装到用户的计算机就像玩枪.这会适得其反.

(详情请见此处:http://thesunstroke.blogspot.com/2010/06/programmig-like-there-is-no-ms-windows.html)

我基本上和你一样.对我来说,它的工作相当完美.

我的代码代码之间的唯一区别是我有一个INTERNET_FLAG_RELOAD参数来强制从文件而不是缓存下载.你可以尝试一下,看看它是否更好:

hURL := InternetOpenURL(hSession,INTERNET_FLAG_RELOAD,0) ;

在下载之前还要检查互联网连接.做这个:

dwConnectionTypes := INTERNET_CONNECTION_MODEM
                 + INTERNET_CONNECTION_LAN
                 + INTERNET_CONNECTION_PROXY;
  InternetConnected := InternetGetConnectedState(@dwConnectionTypes,0);
  if InternetConnected then ...

猜你在找的Windows相关文章