2016-10-12 14 views
-1

リモートサーバーからエンドユーザーのコンピュータに5つのファイルをダウンロードするダウンローダを作成しようとしています。それに問題があります。 Function after Functionを使用することで、ダウンロードしますが、リモートファイルを読み込んでファイル名を取得し、配列に入れて一つの関数から一つずつダウンロードする必要があります。これはAsynchを使用してC#で書かれています。C#の配列を使用して複数のファイルをダウンロード

以下のマイコード。どんな助けもありがとう。

// Start Downloads 
    private void getPatch() 
    { 
     sw.Start(); 
     string patchlist = Settings1.Default.patchlist; 
     label1.Text = "Downloading"; 
     button2.Image = Properties.Resources.PlayButtonDisabled; 
     button4.Visible = false; 
     progressBar1.Visible = true; 
     Directory.CreateDirectory("WTF"); 

     string[] files = new string[6]; 
     files[0] = "libeay32.dll"; 
     files[1] = "libmysql.dll"; 
     files[2] = "libssl32.dll"; 
     files[3] = "ssleay32.dll"; 
     files[4] = "connection_patcher.exe"; 
     files[5] = "Config.conf"; 

     // Loop 
     foreach (var file in files) 
     { 

      var webClient = new WebClient(); 
      webClient.DownloadFile(Settings1.Default.baseURL + file, file); 
      webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged); 
      webClient.DownloadStringCompleted += OnGetDownloadedStringCompleted; 
     } 
    } 
+0

問題は何ですか? – plast1k

+0

リスト内に指定されたファイルはダウンロードされません。リストは各行のファイル名です。 – Keldo

+0

サンプルには「リストに指定されたファイル」はありません( 'filelist'は単一文字です)。このコードから期待するものはあまり明確ではありません。この記事への回答は、提供されたコードのバグ、既存のソリューションのリンクhttp://stackoverflow.com/questions/22747645/download-multiple-files-in-parallel-using-c-sharpを参照してください。 –

答えて

1

foreach(...)ループを詳しく見てください。あなたが実際によくない文字列「http://somedomain.com/file_list」、の各文字をループすることがあります、それのルックスから

foreach (var url in filelist) 

。ここで 'var'キーワードを避けることはコンパイル時にこれを捕らえてしまいます。

webClient.DownloadFileTaskAsync(new Uri(Settings1.Default.baseURL + rFile), rFile); 

RFILEは、実際にはどちらか私たちに何か良いをしない単一の文字列に一緒にサーバからダウンロードしたファイルの内容全体を、その5行を持つことになります。

ファイルリストの場所から内容を取得したら、それを分割して各行にループする必要があります。

string rFile = webClient.DownloadString(filelist); 
foreach (string singleFile in rFile.Split(new string[] { Environment.NewLine }, StringSplitOptions.None)) 
{ 
    await webClient.DownloadFileTaskAsync(new Uri(Settings1.Default.baseURL + singleFile), singleFile); 
} 
+0

foreach(filelistlist.Split(string)singleFile in filelistlist.Split(System.Environment.NewLine))... – Keldo

+0

エラー - '文字列'から 'char'に変換できません – Keldo

+0

申し訳ありません、良いはずです。また、何文字列を分割しているのかを修正しました – plast1k

0

私はすぐにあなたが見落としているかもしれないいくつかのことを見ています。

まず、foreach(ファイルリストのURL)を反復していますが、ループ内のどこでも 'url'を使用しているとは思われません。ダウンロード文字列は、ループの各ステップですべて同じです。

2番目は、非同期で実行されるDownloadFileTaskAsyncを使用しています。これは、すべてのファイルが同時にダウンロードされていることを意味します。エラーが出るかもしれませんが、ループの最後の反復だけが実際に動作していると想像して見てください。いずれにせよ、ここにあなたのコードと私はそれを修正すると思います。

また、実行前にイベントハンドラをフックアップすることをお勧めします。あなたはコードを一度に1つのファイルを引っ張ってくることやろうとしているしているかのアイデアを想定

//あなたのコード

private void getFiles() 
{ 
    string filelist = "http://somedomain.com/file_list"; 
      label1.Text = "Downloading"; 
      button2.Image = Properties.Resources.ButtonDisabled; 
      progressBar1.Visible = true; 
      var webClient = new WebClient(); 
      string rFile = webClient.DownloadString(filelist); 
      webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged); 
      foreach (var url in filelist) 
      { 
       webClient.DownloadFileTaskAsync(new Uri(Settings1.Default.baseURL + rFile), rFile); 
      } 
      webClient.DownloadStringCompleted += OnGetDownloadedStringCompleted; 

} 

//。 DownloadFileAsyncタスクを適切に使用するためにawait/asyncを追加しました。うまくいけば、これは助けとして私がちょうど翼を立てているのであなたが見落としているかもしれないものを見ることを助けるか、または許可する。

private async void getFiles() 
    { 
     string filelist = "http://somedomain.com/file_list"; 
     //label1.Text = "Downloading"; 
     //button2.Image = Properties.Resources.ButtonDisabled; 
     //progressBar1.Visible = true; 
     using (var webClient = new WebClient()) 
     { 
      webClient.DownloadStringCompleted += OnGetDownloadedStringCompleted; 
      webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged); 
      var rFile = webClient.DownloadString(filelist); 

      //rFile needs broken up somehow since it is a string and not an array... unless you want the characters to be the array... which is odd. 
      //So for dummying the code to work for now... 
      var rFiles = rFile.Split(','); 

      foreach (var url in rFiles) 
       await webClient.DownloadFileTaskAsync(new Uri(Settings1.Default.baseURL + url), rFile); 
     } 
    } 
+0

file_listの各ファイルは単にファイル名です。つまり、baseURlがdomain.com/files/(実際のドメインはここでは使用していません)であるlibmysql.dllですので、foreachのURLはまったく意味がありません。もし彼らがラインでエリインをしているなら、どのように助けてくれるでしょうか? – Keldo

+0

これはファイルをダウンロードしません – Keldo

+0

あなたのコードでは、ダウンロード文字列の値を変更していません。 foreach(filelistのvar url)と 'url'は使用されていません。実際にファイルリストから何が戻ってくるのか、その文字列がどのように見えるのかわからないので、私があなたに送るコードは疑問です。 foreachループにブレークポイントを配置しようとしましたか?それを行い、値のURLにカーソルを合わせて、あなたに見えるものを教えてください。また、結果の文字列が 'string filelist = "http://somedomain.com/file_list"のものであることを私に送ることができれば、あなたの本当のURLを送信していないと分かり、あなたに質問しません。 –

関連する問題