Sollte ich File.Exists vor dem Aufruf von File.Delete aufrufen?

8

Ich habe ein File.Delete in meiner finally-Klausel wie folgt:

%Vor%

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?

    
Codeman 19.01.2013, 01:05
quelle

6 Antworten

9

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.

    
David Schwartz 19.01.2013, 01:07
quelle
9

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.

    
Guffa 19.01.2013 01:08
quelle
4

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

ausgeben %Vor%

MSDN File.Delete

    
Ismail Hawayel 11.11.2015 19:09
quelle
1

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:

  1. Die Datei existierte anfangs nie (Sie haben die try beendet und die finally vor der Erstellung der Datei eingegeben)

  2. 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).

    
slugster 19.01.2013 01:21
quelle
1

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.

    
babakgh 19.01.2013 01:47
quelle
0

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.

  • Hat Ihr Code die Datei generiert? Wenn dies der Fall ist, müssen Sie nicht wirklich überprüfen, ob die Datei existiert.
  • Mögen Sie andere Probleme? Denken Sie daran, dass Sie mit einem Dateisystem arbeiten, und die MSDN-Dokumentation zeigt Ihnen eindeutig, dass die Methode aufgrund anderer Umstände Ausnahmen generieren kann.
m-y 19.01.2013 01:32
quelle

Tags und Links