2016-03-26 12 views
1

Wie kann ich die Datei herunterladen und den Download-Fortschritt von ProgressBar in der Fensterformular-App anzeigen?RestSharp DownloadDatensynchronisierung mit Fortschrittsbalken

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"); 
} 

Ich schreibe somethink wie das, aber ich weiß nicht, was jetzt?

Antwort

1

Es tut uns leid, aber Sie können nicht, weil es kein Ereignishandler-Objekt in RestClient gibt, um den Status von Download-Daten zu übernehmen.

Hier ist eine alternative Möglichkeit, es zu tun;

 //... 
     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; 
     } 
    } 

Ändern Sie den Namen von "timer1" für Benennung-Best-Practices. Viel Glück ...

3

Ich denke, eine bessere Alternative wäre Filestream außer Kraft zu setzen Anzahl von Bytes zu bekommen in die Datei geschrieben:

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); 
} 

wo HikFileStream ist:

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

Dies funktioniert perfekt! – achopra