我已經簽出了有用的鏈接how to download a file from internet using Delphi和我的問題相關,但我會很感激一個指針開始。我需要能夠將Web服務器文件夾中的所有文件複製到本地文件夾。我不知道有多少文件,或者是否有互聯網連接。是否有組件可以幫助我?或者我可以使用Windows API? 謝謝 布賴恩如何使用Delphi從網絡服務器下載文件的文件夾
回答
我會從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
完美的Jeroen,謝謝。布萊恩。 – 2011-01-07 09:24:09
由於HTTP實際上不處理作爲文件的文件夾的概念,您應該檢查服務器上是否可用FTP。
但是,如果您確定自己堅持使用HTTP,則首先必須找到一種方法來收集所有文件的(完整)URL列表,然後使用其中一個技術。
(那麼你可以嘗試同時下載多個,但豐富的經驗告訴我們,帶寬就是:帶寬,只是只要下載了一些文件,一個一個或全部一起約需)
如果且僅當Web服務器配置爲允許目錄瀏覽(大多數服務器不這樣做),則可以請求該文件夾的URL,並且Web服務器將返回包含目錄列表的HTML文件。然後,您必須解析HTML以確定單個文件名,然後一次請求一個URL。
如果禁用了目錄瀏覽功能,那麼在沒有提前知道文件名的情況下,就無法做你所要求的功能。如果可用,使用FTP是更好的選擇。
謝謝。我很高興使用FTP。你能建議如何做到這一點? – 2011-01-06 09:26:31
您可以使用Jeroen Pluimers顯示的相同代碼。 WinInet API適用於FTP以及HTTP。只需使用FTP URL而不是HTTP URL。 WinInet API還提供了一些可用的FTP特定功能,而現在正在使用的功能對於多種協議而言更具通用性。 – 2011-01-06 21:10:14
如果HTTP服務器支持WebDAV,您可以簡單地使用map a network drive並使用文件系統命令遍歷服務器端文件。
如果您的應用程序無權創建網絡驅動器,則可以使用Delphi的現有WebDAV客戶端實現之一。
- 1. 如何從網絡服務器的excel文件下載數據
- 2. 下載文件時從網絡服務器上刪除文件
- 3. 如何使用asp.net C從服務器下載包含文件的文件夾#
- 4. 網絡文件夾瀏覽器服務
- 5. 如何使用網絡文件管理器瀏覽服務器文件夾
- 6. 從網絡服務器下載任何文件類型
- 7. 如何從我的網站從其他網絡服務器下載CSV文件?
- 8. 如何從服務器下載文件,使用asp.net網站
- 9. 從FTP服務器下載文件到網絡驅動器
- 10. 無法從網絡服務器(OTA)下載上傳的文件
- 11. Android - 從服務器上的文件夾下載所有文件
- 12. 如何從服務器下載文件
- 13. 如何從服務器下載文件?
- 14. 從網絡服務器下載多個文件
- 15. 加速從網絡服務器下載文件
- 16. 從Web服務器文件夾下載Excel文件
- 17. 使用ASP.NET網絡服務帳戶訪問網絡文件夾
- 18. 使用flash從FTP服務器下載文件夾
- 19. 如何從我的網絡服務器下載文件到我的桌面?
- 20. 如何從FTP服務器下載文件夾
- 21. delphi windows服務無法從網上下載文件
- 22. 如何將文件從網絡服務器下載到您的計算機上?
- 23. 如何從文件夾下載文件?
- 24. 使用Win7 + IE11,無法從內部網絡服務器下載某個文件
- 25. 在我的網絡服務器中下載文件
- 26. 使用node.js將文件從網址下載到服務器
- 27. 從網絡下載文本文件
- 28. 如何通過ssh從網址下載文件到服務器
- 29. 如何通過網絡服務下載文件?
- 30. 如何從服務器文件夾
這取決於Web服務器上。在一般情況下,我認爲這完全不可能。不過,你可以使用FTP,而不是HTTP。那麼這很容易。 – 2011-01-06 00:48:01
[下載文件夾從服務器到本地主機...](http://stackoverflow.com/questions/2043250/download-a-folder-from-server-to-local-host) – 2011-01-06 06:33:08
@Andreas:那就是FTP吧!你能指點我的相關德爾福組件/示例嗎?非常感謝。 – 2011-01-06 09:28:22