2016-12-16 2 views
0

私は、テキストファイルに保存されているいくつかのURLを持って、それらのそれぞれが、私はこれらのイメージをダウンロードし、それらを格納しようとしているhttps://www.facebook.com/images/emoji.php/v5/u75/1/16/1f618.pngWebクライアントをダウンロードする前に、ページの読み込みを待っ

のようなFacebookの絵文字につながるリンクがあります私のディスクに。私は

using (var client = new WebClient()) 
{ 
    client.DownloadFileAsync(imgURL, imgName); 
} 

のようなものが私の問題は、いくつかは私にファイル破損しているエラーを与え、画像の一部がOKにダウンロードされ、10を言う、URLの量が少なくてもある、DownloadFileAsyncでWebクライアントを使用しています。だから、私は最後まで、ダウンロードするファイルのを待つために必要な考えとDownloadFileCompletedイベントを追加し、この

using System; 
using System.ComponentModel; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 

class Program 
{ 
    static Queue<string> q; 

    static void Main(string[] args) 
    { 
     q = new Queue<string>(new[] { 
      "https://www.facebook.com/images/emoji.php/v5/u51/1/16/1f603.png", 
      "https://www.facebook.com/images/emoji.php/v5/ud2/1/16/1f604.png", 
      "https://www.facebook.com/images/emoji.php/v5/ud4/1/16/1f606.png", 
      "https://www.facebook.com/images/emoji.php/v5/u57/1/16/1f609.png", 
      "https://www.facebook.com/images/emoji.php/v5/u7f/1/16/1f60a.png", 
      "https://www.facebook.com/images/emoji.php/v5/ufb/1/16/263a.png", 
      "https://www.facebook.com/images/emoji.php/v5/u81/1/16/1f60c.png", 
      "https://www.facebook.com/images/emoji.php/v5/u2/1/16/1f60d.png", 
      "https://www.facebook.com/images/emoji.php/v5/u75/1/16/1f618.png", 
      "https://www.facebook.com/images/emoji.php/v5/u1e/1/16/1f61a.png" 
     }); 
     DownloadItem(); 
     Console.WriteLine("Hit return after 'finished' has appeared..."); 
     Console.ReadLine(); 
    } 

    private static void DownloadItem() 
    {   
     if (q.Any()) 
     { 
      var uri = new Uri(q.Dequeue()); 
      var file = uri.Segments.Last(); 

      var webClient = new WebClient(); 
      webClient.DownloadFileCompleted += DownloadFileCompleted; 
      webClient.DownloadFileAsync(uri, file); 
     } 
     else 
     { 
      Console.WriteLine("finished"); 
     } 
    } 

    private static void DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) 
    { 
     DownloadItem(); 
    } 
} 

のようにそれは助けにはならなかったと私は破損しているファイルによく見ることにしました。

破損したファイルは実際にはイメージファイルではなく、リダイレクションJavaScriptコードがイメージにあるか、ブラウザがサポートされていないことを示す完全なHTMLページであったかのようです。

私の質問は、イメージファイルが完全にロードされ、ダウンロードする準備ができているのを実際にどのように待つのですか?

EDIT私もusingステートメントを削除しようとしましたが、それでも役に立たなかったです。

+1

は、あなたの現在の問題に関連していない可能性がありますが、あなたは非同期プロセスをキックオフしてから*の*廃棄している

webClient.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (compatible; http://example.org/)"); 
あなたは非同期プロセスを( 'using'ステートメントを介して)始めました。私はあなたのオブジェクト管理を改善して、あなたが実際に実行されるまであなたの 'WebClient'の' Dispose'をしないようにしたいと思います。あなたはまだ基本を正しく理解しようとしていますが、今は非同期を無視することをお勧めします。 –

+0

@Damien_The_Unbeliever非同期なしでも試しましたが、1つのファイルしかダウンロードされません。 usingステートメントの削除について - それは役に立たなかった、以下の私のコメントを参照してください。 –

+0

その編集を追加するだけで、私が以前に要求した[mcve]を提供するほど役に立ちません。 –

答えて

1

あなたのダウンロードでは何も壊れていません。Facebookに決定すると(時には、奇妙なことですが)、クライアントにイメージを提供したくないということがあります。

問題を引き起こすユーザーエージェントがないようです。あなたがやらなければならないことは、ユーザーエージェントを指定しており、それはそれを修正するようにそれが見えます:

+0

うわー私は今より大きな量でそれをテストしており、うまくいきます。あなたに助けてくれてありがとう!私は決して自分自身を推測していないだろう。 –

+0

@ tube-builderこれは、伝説の人からの答えです。それは仕事に縛られています。 :) http://meta.stackexchange.com/questions/9134/jon-skeet-facts – Atul

+0

@Atulええ、私はそれを知っている:) –

関連する問題