0

私はC#WebClient DownloadFileAsyncを使用していくつかの問題に遭遇しました、そしてあなたが私を助けてくれることを願っています。

これが私のシナリオです:

WebClient DownloadFileAsyncを使用して、同時に多くのファイル(http://example.com/abc/1.jpg、http://example.com/abc/efg/2.jpgなど)をダウンロードしています。

私の現在のサンプルコードは次のとおりです。

while (theres still files in http://example.com/abc/) {
    // filename will be something like /abc/1.jpg, /abc/efg/2.jpg
    if (!file.exists(directory.getcurrentdirectory()+filename.Replace('/', '\\'))) {
        WebClient webClient = new WebClient();
        webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(downloadProgressChanged);
        webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(downloadCompleted);
        webClient.DownloadFileAsync(new Uri("http://example.com"+filename), Directory.GetCurrentDirectory()+filename.Replace('/', '\\'));
    }

ダウンロード中のすべてのファイルが1つのプログレスバーに表示されるようにするにはどうすればよいですか?

例えば。1.jpgは50kb、2.jpgは50kb、1.jpgのダウンロードが完了すると、進行状況バーに50%が表示され、2.jpgは進行状況バーに51%から100%表示されます。

また、ファイル名が/abc/1.jpgの場合、現在のディレクトリにabcというフォルダがないと、ダウンロードは機能しません。ファイル名に応じて自動的にフォルダを作成するにはどうすればよいですか?(例:/random123/3.jpg、/anotherrandom/4.jpgなど)

4

2 に答える 2

0

全体的な進行状況カウンターを提供するには、進行中の転送ごとにこれまでに完了した量とダウンロードする合計量を収集し、それらを合計して全体の合計を計算する一元化されたルーチンが必要になります。転送は並行して実行されるため、各ファイルにプログレスバーのチャンク(51〜100%など)を割り当てることはできません。

ほとんどのAPIでは、ファイルを書き込む前に自分用のフォルダーを作成する必要があります。ファイルの書き込みを開始する前に、これを実行して、パス上に欠落しているすべてのフォルダーを作成します。

Directory.CreateDirectory(Path.GetDirectoryName(filename));
于 2011-06-19T14:07:49.520 に答える
0

プログレス バーの処理を行うには、キューを使用できます。何かのダウンロードが終了したら、プログレス バーを更新し、次のダウンロードを開始します。ただし、 WebClient クラスは、ダウンロードが完了したかどうかだけで、ダウンロードがどれだけ完了したかを伝えることができるとは思いません。

ディレクトリが存在するかどうかを確認するには、次を使用します。

if (!System.IO.Directory.Exists(folder_name)) System.IO.Directory.Create(folder_name);

System.IO.Path クラスを使用して、パスからディレクトリを取得できます。

于 2011-06-19T14:18:43.777 に答える