2011-01-05 22 views
2

usefuleのリンクhow to download a file from internet using Delphiをチェックアウトしましたが、私の質問には関連していますが、 Webサーバーのフォルダ内のすべてのファイルをローカルフォルダにコピーできるようにする必要があります。どれくらいのファイルがあるか、実際にインターネットに接続されているかどうかは分かりません。私を喜ばせるのに役立つコンポーネントはありますか?または、Windows APIを使用できますか? ありがとう ブライアンDelphiを使用してWebサーバーからファイルのフォルダをダウンロードするには

+0

これは、Webサーバーによって異なります。一般的なケースでは、これはまったく可能ではない、と私は思う。 HTTPではなく、FTPを使用することもできます。それは簡単だろう。 –

+0

可能な複製[サーバーからローカルホストにフォルダをダウンロード...](http://stackoverflow.com/questions/2043250/download-a-folder-from-server-to-local-host) –

+0

@アンドレアス:それはFTPです!関連するDelphiコンポーネント/サンプルを教えてください。どうもありがとう。 –

答えて

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

パーフェクトジェーレン、ありがとう。ブライアン –

0

HTTPは実際にはファイルのフォルダとして概念を処理しないので、サーバーでFTPが使用できるかどうかを確認する必要があります。

まだHTTPに悩まされている場合は、まずすべてのファイルの(完全な)URLのリストを収集し、次のいずれかを使用して1つずつダウンロードする方法を見つける必要があります。技術。

(あなたはその後、同時に複数のダウンロードを試みることができるが、豊富な経験は、その帯域幅がまさにそれです教えて:帯域幅、および一緒にファイルをひとつずつ、またはすべての数をダウンロードするだけのように長さ約かかります。)

3

Webサーバーがディレクトリブラウズを許可するように設定されている場合(ほとんどのサーバーでは許可されていない場合)、フォルダのURLを要求することができ、Webサーバーはディレクトリ一覧を含むHTMLファイルを返します。その後、HTMLを解析して個々のファイル名を特定し、一度に1つずつURLを要求する必要があります。

ディレクトリブラウジングが無効になっている場合、前もってファイル名を知らずに求めていることを行う方法がありません。利用可能であれば、FTPを使用する方が良い選択です。

+0

ありがとうございます。私はFTPを使用して非常に満足しています。あなたはこれを行う方法を提案できますか? –

+0

Jeroen Pluimersと同じコードを使用できます。 WinInet APIは、FTPとHTTPの両方で動作します。 HTTP URLの代わりにFTP URLを使用するだけです。 WinInet APIにはFTP特有の機能もありますが、現在使用している機能は複数のプロトコルの汎用性があります。 –

1

HTTPサーバーがWebDAVをサポートしている場合は、単純にmap a network driveとし、ファイルシステムコマンドを使用してサーバー側のファイルを反復することができます。

アプリケーションにネットワークドライブを作成する権限がない場合は、既存のWebDAVクライアントのDelphi用実装を代わりに使用できます。

関連する問題