2011-01-05 122 views
2

我已经签出了有用的链接how to download a file from internet using Delphi和我的问题相关,但我会很感激一个指针开始。我需要能够将Web服务器文件夹中的所有文件复制到本地文件夹。我不知道有多少文件,或者是否有互联网连接。是否有组件可以帮助我?或者我可以使用Windows API? 谢谢 布赖恩如何使用Delphi从网络服务器下载文件的文件夹

+0

这取决于Web服务器上。在一般情况下,我认为这完全不可能。不过,你可以使用FTP,而不是HTTP。那么这很容易。 – 2011-01-06 00:48:01

+0

[下载文件夹从服务器到本地主机...](http://stackoverflow.com/questions/2043250/download-a-folder-from-server-to-local-host) – 2011-01-06 06:33:08

+0

@Andreas:那就是FTP吧!你能指点我的相关德尔福组件/示例吗?非常感谢。 – 2011-01-06 09:28:22

回答

2

我会从this answer开始,而不是将输出结果放在一个字符串中,将缓冲区写入TFileStream。

WinInet真的很不错,因为它尊重用户在Windows上设置的代理设置(所以你不必花费大量的工作来设置Indy的配置)。

编辑:

我重构这个答案有点下载二进制文件。
由于它使用WinInet,你可以使用它来同时进行ftp和http下载(是的,我检查过它)。
您可以将其扩展为使用FtpFindFirstFile/InternetFindNextFile并阅读大量文件。

unit DownloadBinaryFileUnit; 

interface 

uses 
    Classes, 
    WinInet; 

type 
    TWinInet = class 
    strict protected 
    class procedure ReadBinaryFileResponse(const UrlHandle: HINTERNET; const LocalFileName: string); static; 
    class procedure ReadResponse(const UrlHandle: HINTERNET; const ContentStream: TStream); 
    public 
    class procedure DownloadBinaryFile(const UserAgent, Url, LocalFileName: string); overload; static; 
    end; 


implementation 

uses 
    SysUtils, 
    Variants, 
    Windows, 
    IOUtils; 

class procedure TWinInet.DownloadBinaryFile(const UserAgent, Url, LocalFileName: string); 
var 
    InternetHandle: HINTERNET; 
    UrlHandle: HINTERNET; 
begin 
    InternetHandle := InternetOpen(PChar(UserAgent), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); 
    try 
    UrlHandle := InternetOpenUrl(InternetHandle, PChar(Url), nil, 0, 0, 0); 
    try 
     ReadBinaryFileResponse(UrlHandle, LocalFileName); 
    finally 
     InternetCloseHandle(UrlHandle); 
    end; 
    finally 
    InternetCloseHandle(InternetHandle); 
    end; 
end; 

class procedure TWinInet.ReadBinaryFileResponse(const UrlHandle: HINTERNET; const LocalFileName: string); 
var 
    ContentStream: TFileStream; 
begin 
    ContentStream := TFile.Create(LocalFileName); 
    try 
    ReadResponse(UrlHandle, ContentStream); 
    finally 
    ContentStream.Free; 
    end; 
end; 

class procedure TWinInet.ReadResponse(const UrlHandle: HINTERNET; const ContentStream: TStream); 
var 
    Buffer: array[0..1023] of Byte; 
    BytesRead: Cardinal; 
begin 
    repeat 
    InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead); 
    ContentStream.Write(Buffer, BytesRead); 
    until BytesRead = 0; 
end; 

end. 

--jeroen

+0

完美的Jeroen,谢谢。布莱恩。 – 2011-01-07 09:24:09

0

由于HTTP实际上不处理作为文件的文件夹的概念,您应该检查服务器上是否可用FTP。

但是,如果您确定自己坚持使用HTTP,则首先必须找到一种方法来收集所有文件的(完整)URL列表,然后使用其中一个技术。

(那么你可以尝试同时下载多个,但丰富的经验告诉我们,带宽就是:带宽,只是只要下载了一些文件,一个一个或全部一起约需)

3

如果且仅当Web服务器配置为允许目录浏览(大多数服务器不这样做),则可以请求该文件夹的URL,并且Web服务器将返回包含目录列表的HTML文件。然后,您必须解析HTML以确定单个文件名,然后一次请求一个URL。

如果禁用了目录浏览功能,那么在没有提前知道文件名的情况下,就无法做你所要求的功能。如果可用,使用FTP是更好的选择。

+0

谢谢。我很高兴使用FTP。你能建议如何做到这一点? – 2011-01-06 09:26:31

+0

您可以使用Jeroen Pluimers显示的相同代码。 WinInet API适用于FTP以及HTTP。只需使用FTP URL而不是HTTP URL。 WinInet API还提供了一些可用的FTP特定功能,而现在正在使用的功能对于多种协议而言更具通用性。 – 2011-01-06 21:10:14

1

如果HTTP服务器支持WebDAV,您可以简单地使用map a network drive并使用文件系统命令遍历服务器端文件。

如果您的应用程序无权创建网络驱动器,则可以使用Delphi的现有WebDAV客户端实现之一。

相关问题