2016-03-26 7 views
1

ProgressBarによるファイルのダウンロードと進行状況をウィンドウフォームアプリケーションで表示するにはどうすればよいですか?RestSharp DownloadDataとプログレスバーの同期

RestClient client = new RestClient("http://127.0.0.1/"); 

RestRequest request = new RestRequest("/test/{FileName}"); 
request.AddParameter("FileName", "testFile.abc", ParameterType.UrlSegment); 

string path = @"C:/Users/[user]/Desktop/testFile.abc"; 

var fileForDownload = client.DownloadData(request); 

fileForDownload.SaveAs(path); 

if (File.Exists(@"C:/Users/[user]/Desktop/testFile.abc")) 
{ 
    MessageBox.Show("done"); 
} 

私はこのようなsomethink書くが、私は今何を知りませんか?

答えて

1

残念ですが、ダウンロードデータのステータスを取得するためのRestClientにイベントハンドラオブジェクトがないため、できません。

これを行う別の方法があります。

 //... 
     timer1.Interval = 1000; // 1 sec interval. 

     timer1.Start(); 

     RestClient client = new RestClient("http://127.0.0.1/") 
          { 
           Timeout = 10 * 1000 //10 sec timeout time. 
          }; 

     RestRequest request = new RestRequest("/test/{FileName}"); 
     request.AddParameter("FileName", "testFile.abc", ParameterType.UrlSegment); 

     string path = @"C:/Users/[user]/Desktop/testFile.abc"; 

     var fileForDownload = client.DownloadData(request); 

     fileForDownload.SaveAs(path); 

     if (File.Exists(@"C:/Users/[user]/Desktop/testFile.abc")) 
     { 
      MessageBox.Show("done"); 
     } 

     progressBar1.Value = 100; 
     timer1.Stop(); 
    } 

    public void timer1_Tick(object sender, EventArgs e) 
    { 
     if (progressBar1.Value <= 100) 
     { 
      progressBar1.Value += 10; 
     } 

     if (progressBar1.Value >= 100) 
     { 
      progressBar1.Value = 0; 
     } 
    } 

naming-best-practicesの「timer1」の名前を変更します。幸運...

3

私はより良い代替手段がファイルに書き込まれたデータのバイト数を取得するためのFileStreamを上書きすることだと思う:

HikFileStreamがある
string tempFile = Path.Combine(Configuration.DownloadFolder, "TEST.DATA"); 
using (var writer = new HikFileStream(tempFile)) 
{ 
    writer.Progress += (w, e) => { 
#if DEBUG 
     Console.Write(string.Format("\rProgress: {0}/{1:P2}", writer.CurrentSize, ((double)writer.CurrentSize)/finalFileSize)); 
#endif 
    }; 
    request.ResponseWriter = (responseStream) => responseStream.CopyTo(writer); 
    var response = client.DownloadData(request); 
} 

class HikFileStream : FileStream 
{ 
    public HikFileStream(string path) 
     : base(path, FileMode.Create, FileAccess.Write, FileShare.None) 
    { 
    } 

    public long CurrentSize { get; private set; } 


    public event EventHandler Progress; 

    public override void Write(byte[] array, int offset, int count) 
    { 
     base.Write(array, offset, count); 
     CurrentSize += count; 
     var h = Progress; 
     if (h != null) 
      h(this, EventArgs.Empty);//WARN: THIS SHOULD RETURNS ASAP! 
    } 

} 
+0

これは完璧に動作します! – achopra

関連する問題