2011-01-05 121 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客戶端實現之一。

相關問題