2011-09-14 3 views
0

WebClientオブジェクトをそれぞれ5%のチャンクで使用してデータをダウンロードしようとしています。その理由は、ダウンロードした各チャンクについて進捗状況を報告する必要があるからです。ここでWebClient.OpenReadチャンク内のデータをダウンロード

私はこの作業を行うに書いたコードです:

private void ManageDownloadingByExtractingContentDisposition(WebClient client, Uri uri) 
    { 
     //Initialize the downloading stream 
     Stream str = client.OpenRead(uri.PathAndQuery); 

     WebHeaderCollection whc = client.ResponseHeaders; 
     string contentDisposition = whc["Content-Disposition"]; 
     string contentLength = whc["Content-Length"]; 
     string fileName = contentDisposition.Substring(contentDisposition.IndexOf("=") +1); 

     int totalLength = (Int32.Parse(contentLength)); 
     int fivePercent = ((totalLength)/10)/2; 

     //buffer of 5% of stream 
     byte[] fivePercentBuffer = new byte[fivePercent]; 

     using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite)) 
     { 
      int count; 
      //read chunks of 5% and write them to file 
      while((count = str.Read(fivePercentBuffer, 0, fivePercent)) > 0); 
      { 
       fs.Write(fivePercentBuffer, 0, count); 
      } 
     } 
     str.Close(); 
    } 

問題を - それはstr.Read(になったときに)、それは全体の流れを読んだ限りを一時停止し、その後、カウントが0でありますですから、たとえ5Percent変数だけを読み込むように指定したとしても、while()は機能しません。最初の試行でストリーム全体を読み込むように見えます。

チャンクを正しく読み取れるようにするにはどうすればよいですか?

おかげで、

アンドレイ

+1

WebClient.DownloadProgressChangedイベントに登録してから、WebClient.DownloadDataAsync()を呼び出します。イベントコールバックの進捗状況を更新できます。 – Jon

答えて

1
do 
{ 
    count = str.Read(fivePercentBuffer, 0, fivePercent); 
    fs.Write(fivePercentBuffer, 0, count); 
} while (count > 0); 
+0

これは、ありがとうございます。なぜそれが動作するか把握することはできません。おそらく後のカウントが変更されているためです。 –

1

あなたが正確な5%のチャンクサイズを必要としない場合、あなたは、このようなDownloadDataAsyncOpenReadAsyncなどの非同期のダウンロード方法を検討することをお勧めします。

新しいデータがダウンロードされ、進捗が変わるたびにDownloadProgressChangedイベントが発生し、イベントはイベントの引数に完了率を表示します。

いくつかのサンプルコード:

WebClient client = new WebClient(); 
Uri uri = new Uri(address); 

// Specify a progress notification handler. 
client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressCallback); 

client.DownloadDataAsync(uri); 

static void DownloadProgressCallback(object sender, DownloadProgressChangedEventArgs e) 
{ 
    // Displays the operation identifier, and the transfer progress. 
    Console.WriteLine("{0} downloaded {1} of {2} bytes. {3} % complete...", 
     (string)e.UserState, 
     e.BytesReceived, 
     e.TotalBytesToReceive, 
     e.ProgressPercentage); 
} 
+0

お寄せいただきありがとうございますが、アプリケーションでは非同期ダウンロードが許可されていません。私は、同期ダウンロードから進行状況を報告する方法を見つけなければなりません。 –

+1

「アプリケーションが非同期ダウンロードを許可しない」という意味を明確にすることはできますか?あなたのアプリケーションはこれをどうやって防ぐのですか? –

+0

私のアプリケーションは複数のファイルをダウンロードする必要があり、一度に1つずつ同期させる必要があります。これは単にタスクの要求です。これを行うには、最初は同期ダウンロードであるwebclient.DownloadFile()を使用していましたが、進行状況のレポートも行う必要があるため、チャンクを報告するためにwebClient.OpenRead()を使用することを考えました。 –

3

あなたはwhileループと行の最後にセミコロンを持っています。私はそれが気づくまで、受け入れられた答えが正しい理由について非常に混乱しました。

関連する問題