Ich habe ein File.Delete
in meiner finally-Klausel wie folgt:
Nach der C # -Dokumentation muss File.Delete aufgerufen werden Eine nicht vorhandene Datei löst keine Ausnahmen aus.
Ist es in Ordnung, die File.Exists
-Wrappled zu entfernen, oder wird das mich möglichen zusätzlichen Ausnahmen aussetzen?
Wenn Sie es brauchen, ist es nicht ausreichend, da die Datei gelöscht werden könnte, nachdem Sie bestätigen, dass sie existiert. In einem solchen Fall empfiehlt es sich, einfach die Datei zu löschen. Wenn es mit einem Fehler vom Typ "Datei nicht gefunden" fehlschlägt, dann wissen Sie, dass die Datei nicht existiert. Dies entfernt eine zusätzliche Operation und vermeidet jede Art von Rennfenster.
Es gibt eine Situation, in der das Überprüfen von Exists
vor Delete
eine Ausnahme verhindert. Wenn Sie einen Dateinamen mit einem ungültigen Pfad haben, gibt die Methode Exists
false
zurück.
Dann kommt es darauf an, welches Verhalten du willst. In einigen Situationen sollte ein ungültiger Pfad eine Ausnahme verursachen.
Auch, weil die Datei existiert, bedeutet das nicht, dass es immer möglich ist, sie zu löschen (zu dieser Zeit). Für unvorhergesehene Probleme benötigen Sie weiterhin die Ausnahmebehandlung.
File.Delete
wirft keine FileNotFoundException
, das ist egal.
Es wird nur dann eine Ausnahme ausgelöst, wenn der Pfad ungültig ist, da darin Verzeichnisse existieren, die nicht existieren, in diesem Fall wird DirectoryNotFoundException
geworfen.
Dieser Code wird keine Ausnahme auslösen.
%Vor% Dies wird DirectoryNotFoundException
Sehen wir uns das logisch und kritisch an. Angenommen, das MSDN-Doco ist nicht 100% genau (es enthält gelegentliche Fehler) und eine FileNotFoundException könnte geworfen werden, würde dies entweder verursacht:
Die Datei existierte anfangs nie (Sie haben die try
beendet und die finally
vor der Erstellung der Datei eingegeben)
Sie haben einen programmatischen Fehler (Sie haben den Dateipfad oder -namen falsch zusammengestellt)
Man würde annehmen, dass Option # 2 nicht passieren sollte, weil Sie dafür testen, wenn es immer noch passieren kann, dann haben Sie stinkenden Code. Damit bleibt Option # 1 als einzige praktikable Option übrig. In diesem Fall interessiert Sie die Ausnahme nicht, also würden Sie sie einfach abfangen und weitermachen. Das bedeutet, dass Ihre spezifische Frage weitgehend redundant ist, selbst wenn eine FileNotFoundException ausgelöst werden könnte.
Wie auch immer ...
Ich würde das File.Delete immer noch mit einem try / catch einpacken, denn IMVHO gibt es immer noch zwei Ausnahmen, die möglich sind und man beachten müssen: IOException und UnauthorizedAccessException . Wenn einer dieser Fälle auftritt, sollten Sie sich eine Art von Mitigation ansehen (vielleicht richten Sie die Datei beim nächsten Neustart zum Löschen ein und / oder benachrichtigen den Benutzer auf irgendeine Weise).
Sie können immer noch andere Arten von Ausnahmen erhalten. zum Beispiel IOException, wenn die Datei verwendet wird.
Wenn Sie also darauf bestehen, die Datei in finally zu löschen und sichergehen wollen, dass keine Ausnahme auftritt, setzen Sie einfach einen anderen try-catch um File.delete.
%Vor%Aber wenn Ihr Ziel ist, Datei auf jeden Fall zu löschen, denke ich, es wäre eine gute Idee, wenn Sie Datei ausschließlich öffnen und in diesem Fall sollten Sie zuerst die Datei schließen und dann löschen es.
Ich habe eine ähnliche Frage gestellt auf diese Frage vor, und ich kam zu dieser Schlussfolgerung:
Es kommt darauf an . Ja, ich weiß ... nicht wirklich eine einfache Antwort, aber hier sind einige Anmerkungen, die Sie treffen müssen, um zu bestimmen, ob Ihre Situation eine Überprüfung der Datei exist und / oder einen try { ... } catch { ... }
Block um die Methode File.Delete(...)
erfordert.