2012-12-17 9 views
5

Ich habe versucht, Datei wie folgt herunterladen:Webclient DownloadFileCompleted Dateinamen erhalten

WebClient _downloadClient = new WebClient(); 

_downloadClient.DownloadFileCompleted += DownloadFileCompleted; 
_downloadClient.DownloadFileAsync(current.url, _filename); 

// ... 

Und nach dem Herunterladen ich mit Download-Datei einen anderen Prozess starten müssen, habe ich versucht DownloadFileCompleted Ereignis zu verwenden.

void DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) 
{ 
    if (e.Error != null) 
    { 
     throw e.Error; 
    } 
    if (!_downloadFileVersion.Any()) 
    { 
     complited = true; 
    } 
    DownloadFile(); 
} 

Aber ich kann nicht Namen der heruntergeladenen Datei aus AsyncCompletedEventArgs wissen, habe ich meine eigene

public class DownloadCompliteEventArgs: EventArgs 
{ 
    private string _fileName; 
    public string fileName 
    { 
     get 
     { 
      return _fileName; 
     } 
     set 
     { 
      _fileName = value; 
     } 
    } 

    public DownloadCompliteEventArgs(string name) 
    { 
     fileName = name; 
    } 
} 

Aber ich kann nicht verstehen, wie mein Fall rufen statt DownloadFileCompleted

Sorry, wenn es nood Frage ist

+0

http://msdn.microsoft.com/en-us/library/17sde2xt(v=VS.100).aspx – Leri

+0

:

string fileIdentifier="value to remember"; WebClient webClient = new WebClient(); webClient.DownloadFileCompleted += new AsyncCompletedEventHandler (DownloadFileCompleted); webClient.QueryString.Add("file", fileIdentifier); // here you can add values webClient.DownloadFileAsync(new Uri((string)dyndwnldfile.path), localFilePath); 

Und das Ereignis als wie folgt definiert werden vielleicht globale Variable – VladL

+0

ich weiß, wie Ereignisse verwenden =) Ich weiß nicht, wie mein Ereignis statt DownloadFileCompleted mit meinem eventArgs – user1644087

Antwort

12

Eine Möglichkeit besteht darin, einen Abschluss zu erstellen.

 WebClient _downloadClient = new WebClient();   
     _downloadClient.DownloadFileCompleted += DownloadFileCompleted(_filename); 
     _downloadClient.DownloadFileAsync(current.url, _filename); 

Das bedeutet, dass Ihr DownloadFileCompleted den Event-Handler zurückgeben muss.

 public AsyncCompletedEventHandler DownloadFileCompleted(string filename) 
     { 
      Action<object,AsyncCompletedEventArgs> action = (sender,e) => 
      { 
       var _filename = filename; 

       if (e.Error != null) 
       { 
        throw e.Error; 
       } 
       if (!_downloadFileVersion.Any()) 
       { 
        complited = true; 
       } 
       DownloadFile(); 
      }; 
      return new AsyncCompletedEventHandler(action); 
     } 

Der Grund I die Variable namens _FILENAME erstellen ist, so dass der Dateiname in die variable DownloadFileComplete Methode übergeben werden erfasst und in der Verschluss gespeichert. Wenn Sie dies nicht getan hätten, hätten Sie keinen Zugriff auf die Variable filename innerhalb des Abschlusses.

+0

Vielen Dank! Es ist Arbeit! – user1644087

+0

Dies ist das erste Mal, dass ich eine Schließung in C# gesehen habe. Ich wusste nicht einmal, dass das möglich ist. Danke vielmals! –

2

Ich spielte um DownloadFileCompleted herum, um den Dateipfad/Dateinamen von dem Ereignis zu erhalten. Ich habe die obige Lösung auch versucht, aber es war nicht wie meine Erwartung, dann habe ich die Lösung durch Hinzufügen von Querystring Wert, Hier möchte ich den Code mit Ihnen teilen.

private void DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) 
{ 
    string fileIdentifier= ((System.Net.WebClient)(sender)).QueryString["file"]; 
    // process with fileIdentifier 
}