2011-06-19 25 views
0

C#WebClient DownloadFileAsyncを使用していくつかの問題が発生しました。DownloadFileAsync:複数のファイル

は、私がWebクライアント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など)

+0

2つの無関係なことを求めていますが、2つの質問をする必要があります。 – svick

+0

ダウンロードを開始する前に、すべての画像のサイズを知っていますか?または、プログレスバーは画像のサイズとは独立しているべきですか? – svick

+0

ダウンロードを開始する前に、すべてのイメージの合計サイズがわかりません。それは動的でなければなりません。 – initialshl

答えて

0

全体的な進捗カウンターを提供するには、進行中の各転送の金額をダウンロードして合計し、全体の合計を計算します。転送が並行して実行されているため、各ファイルにプログレスバーのチャンク(たとえば51-100%)を割り当てることはできません。

ほとんどのAPIでは、ファイルを書き込む前に自分でフォルダを作成する必要があります。ファイルの書き込みを開始する前に、パス上に見つからないすべてのフォルダを作成するだけです。

Directory.CreateDirectory(Path.GetDirectoryName(filename)); 
+0

ありがとう!ディレクトリの作成がうまくいきます!ダウンロードされるすべてのファイルの合計サイズを集め、自分でパーセンテージを計算して1つのプログレスバーに入れる方法はありますか? – initialshl

+0

ダウンロードされたファイルの合計金額を手伝ってくれますか?私は、PHPからダウンロードするファイルの合計サイズを取得することができますが、私は進行状況バーを計算する方法がわかりません。 – initialshl

0

進捗バーのことを行うには、キューを使用します。ダウンロードが完了したら、プログレスバーを更新して次のダウンロードを開始してください。 しかし、WebClientクラスは、ダウンロードが完了したかどうかだけ、どれだけダウンロードが完了したかを教えてくれます。ディレクトリが存在する場合

は、確認するために使用します。

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

あなたはSystem.IO.Pathクラスを使用して、パスからディレクトリを取得することができます。