Csharp-programmierer - Sa 16.04.16 18:50
Titel: Fehlerbehebung
Hallo. Ich habe nun einen Lösungsansatz gefunden, wie ich meine Anwendung automatisch updaten kann. Auf meiner Website lade ich eine Datei mit der neuesten Version hoch. Bei jeden Programmstart wird diese Datei gedownloadedet und mit der aktuellen Version verglichen. Dann wird die neue Exe heruntergeladen.
So weit so gut. Jedoch kommt an folgender Stelle ein Fehler. Meine Vermutung ist, dass der WebClient einen Stream zurückgibt und die Datei deswegen nicht geöffnet werden kann:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| var s = Schuldenverwaltung.Öffnen();
WebClient webclient = new WebClient(); Uri uri = new Uri(@"http://mailet-software.weebly.com/uploads/7/2/0/5/72054763/version3.txt"); webclient.DownloadFileAsync(uri, Path.Combine(Application.StartupPath, "Version.txt"));
string VersionNumber = "";
using (StreamReader file = new StreamReader(Path.Combine(Application.StartupPath, "Version.txt"))) { VersionNumber = file.ReadToEnd(); file.Close(); }
if (VersionNumber != s.Version) { MessageBox.Show("Neues Update"); s.Version = VersionNumber; s.Speichern(); } |
Die Fehlermeldung lautet: Der Prozess kann nicht auf die Datei "C:\Users\Yannic M.\documents\visual studio 2013\Projects\Downloader\Downloader\bin\Debug\Version.txt" zugreifen, da sie von einem anderen Prozess verwendet wird.
Ich habe es nach
webclient.DownloadFileAsync(uri, Path.Combine(Application.StartupPath, "Version.txt")); mit
webclient.CancelAsync(); versucht, jedoch wird dann keine Datei erstellt.
Die Datei von meiner Website:
http://mailet-software.weebly.com/neue-seite.html
Wie kann ich diesen Fehler beheben?
Christian S. - Sa 16.04.16 19:00
Ich würde vermuten, dass dadurch, dass Du eine asynchrone Methode für den Download benutzt, dieser noch läuft, während Du bereits wieder auf die Datei zugreifen willst.
Du musst also entweder im entsprechenden *Completed-Ereignis den Vergleich der Versionen durchführen, oder eine synchrone Methode für den Download verwenden oder die Methode
DownloadFileTaskAsync im Zusammenspiel mit
async und await [
https://msdn.microsoft.com/de-de/library/hh191443.aspx].
//edit: Und bitte ändere den Titel dieses Themas, damit er aussagekräftiger ist!
jfheins - So 17.04.16 18:35
Ich würde die ganze Datei umgehen. Du liest die Datei ja eh direkt wieder ein, da kannst du dir den Umweg sparen.
Dann kannst du das auch gleich in einen String ziehen: Am besten mit HttpClient.GetStringAsync ( siehe
https://msdn.microsoft.com/en-us/library/hh551746(v=vs.118).aspx)
Etwa so:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| public static async Task<string> GetVersionFromInternetAsync() { var url = new Uri(@"http://mailet-software.weebly.com/uploads/7/2/0/5/72054763/version3.txt"); using (var client = new HttpClient()) { return await client.GetStringAsync(url); } } |