Benutzer mit den meisten Antworten
wie mit "Process kann nicht auf das file zugreifen, da es von einem anderen process verwendet wird" umgehen?

Frage
-
Tag
ich möchte mit IO.File.Delete(fileName) eine Datei löschen. Es kommt vor dass diese aus bestimmten Gründen von einem anderen Prozess belegt ist (zb: mp3-file: wird abgespielt).
Kann ich vorher checken, ob das Delete einen Fehler hervorrufen wird?
Try-catch klappt jedenfalls nicht zur Fehlerbehandlung.
Oder muss ich auf On Error zurückgreifen?Gruß und Dank!
TH
Antworten
-
Hallo,
natürlich funktioniert Try Catch, z. B.:
Try System.IO.File.Delete("C:\TEMP\Test.wmv") Catch ex As System.UnauthorizedAccessException MessageBox.Show("Sie haben keinen Zugriff auf die Datei:" & ex.Message) Catch ex As System.IO.IOException MessageBox.Show("Die Datei ist derzeit in Verwendung:" & ex.Message) End Try
wobei File.Delete noch andere Ausnahmen werfen kann - bis auf PathToLongException wären das aber mehr Programmierfehler.
Prüfungen nützen nicht wirklich was, da sie ohne Ausnahmebehandlung nicht durchführbar sind. Und womöglich zum Zeitpunkt des Aufrufs von File.Delete bereits veraltet sein können.
Allgemeiner: On Error wird intern in Try Catch und Zusatzcode zur Unterstützung der veralteten VB Classic Methoden bereitgestellt. Man sollte es in neuem Code ganz vermeiden, denn es führt nur Overhead (und Spaghetti - Code).
Gruß Elmar
- Als Antwort markiert Migration Sucks Dienstag, 12. November 2013 07:14
Alle Antworten
-
Hallo,
natürlich funktioniert Try Catch, z. B.:
Try System.IO.File.Delete("C:\TEMP\Test.wmv") Catch ex As System.UnauthorizedAccessException MessageBox.Show("Sie haben keinen Zugriff auf die Datei:" & ex.Message) Catch ex As System.IO.IOException MessageBox.Show("Die Datei ist derzeit in Verwendung:" & ex.Message) End Try
wobei File.Delete noch andere Ausnahmen werfen kann - bis auf PathToLongException wären das aber mehr Programmierfehler.
Prüfungen nützen nicht wirklich was, da sie ohne Ausnahmebehandlung nicht durchführbar sind. Und womöglich zum Zeitpunkt des Aufrufs von File.Delete bereits veraltet sein können.
Allgemeiner: On Error wird intern in Try Catch und Zusatzcode zur Unterstützung der veralteten VB Classic Methoden bereitgestellt. Man sollte es in neuem Code ganz vermeiden, denn es führt nur Overhead (und Spaghetti - Code).
Gruß Elmar
- Als Antwort markiert Migration Sucks Dienstag, 12. November 2013 07:14
-
Hallo,
OnError vergisst du am besten schnell wieder, das ist "schon viel zu alt" ;)Die Delete-Methode löst in einigen Fällen keine Exception aus, wenn die Datei nicht gelöscht werden kann. Siehe hier.
Hinweis zu Windows NT 4.0: Delete löscht keine Datei, die für normale E/A offen ist oder bei der es sich um eine Datei mit Speicherzuordnung (Memory-Mapped File) handelt.
Einige Überprüfungsmöglichkeiten findest du auf nachfolgender Seite.
http://stackoverflow.com/questions/876473/is-there-a-way-to-check-if-a-file-is-in-useIn meiner Signatur findest du einen Konverter für C#/VB.NET.
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.- Bearbeitet Tom Lambert (Koopakiller)Moderator Montag, 11. November 2013 16:42
-
Hallo Tom,
die ganze Überprüferei ist letztendlich für die Katz, siehe auch die Kommentare auf Stackoverflow.
Zumal sie zu den gleichen Ausnahmen führen wie File.Delete => DeleteFile (Windows) und die Error Codes in eine Exception umgewandelt werden. Nur der Fall das die Datei nicht existiert wird stillschweigend fallen gelassen.
Gruß Elmar
-
So dachte ich mir das eigentlich auch, nur dann habe ich eine MP3 Datei mit dem Media Player in Dauer-Schleife gespeilt und versucht diese mit File.Delete zu löschen. Die Anwendung blieb einfach am Löschen-Befehl hängen. Erst nachdem ich den WMP geschlossen habe wurde das Programm weiter ausgefüht und die Datei gelöscht.
Die Löungen auf SO habe ich nun nicht getestet, von der Funktionsweise her machen einige aber Sinn - für mich.
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke. -
natürlich funktioniert Try Catch, z. B.:
Ok Elmar, vielen Dank,
Das funzt nicht, wenn man in Debuggen>Ausnahmen bei System.IO einen Haken stetzt bei 'unterbrechen wenn ausgelöst.' Hab das hiermit verstanden (Ich setze diese Haken gerne, damit ich sehe, wo Fehler sind.)
Wenn ich den Haken hier rausnehme, funktioniert try-catch.
Gruß und Dank TH