36 Stimmen

Wann ist es in Ordnung zu prüfen, ob eine Datei existiert?

Dateisysteme sind flüchtig. Das bedeutet, dass man sich nicht darauf verlassen kann, dass das Ergebnis einer Operation auch für die nächste gültig ist, selbst wenn es sich um die nächste Codezeile handelt. Sie können nicht einfach sagen if (some file exists and I have permissions for it) open the file und man kann nicht sagen if (some file does not exist) create the file . Es besteht immer die Möglichkeit, dass das Ergebnis Ihrer if Zustand wird ändern zwischen den beiden Teilen Ihres Codes. Die Operationen sind getrennt: nicht atomar.

Erschwerend kommt hinzu, dass die Art des Problems bedeutet, dass Sie, wenn Sie versucht sind, diese Prüfung vorzunehmen, wahrscheinlich bereits besorgt sind oder sich bewusst sind, dass etwas, das Sie nicht kontrollieren können, mit der Datei passieren könnte. Aufgrund der Beschaffenheit von Entwicklungsumgebungen ist es unwahrscheinlich, dass dieses Ereignis während Ihrer Tests auftritt und sehr schwer zu reproduzieren. Sie haben also nicht nur einen Fehler, sondern der Fehler wird beim Testen auch nicht auftauchen.

Daher ist es unter normalen Umständen am besten, gar nicht erst zu versuchen zu prüfen, ob eine Datei oder ein Verzeichnis existiert. Stecken Sie Ihre Entwicklungszeit stattdessen in die Behandlung von Ausnahmen aus dem Dateisystem. Sie müssen diese Ausnahmen ohnehin behandeln, so dass dies eine viel bessere Nutzung Ihrer Ressourcen ist. Auch wenn Ausnahmen langsam sind, erfordert die Überprüfung der Existenz einer Datei einen zusätzlichen Zugriff auf die Festplatte, und der Zugriff auf die Festplatte ist viel langsamer. Ich habe sogar ein gut gewähltes respuesta in einer anderen Frage zu diesem Thema.

Aber ich habe einige Zweifel. In .Net, zum Beispiel, wenn das wirklich ist immer wahr, die .Exists() Methoden wären gar nicht erst in die API aufgenommen worden. Denken Sie auch an Szenarien, in denen Sie erwarten die Ihr Programm zum Erstellen der Datei benötigt. Das erste Beispiel, das mir in den Sinn kommt, betrifft eine Desktop-Anwendung. Diese Anwendung installiert eine Standard-Benutzerkonfigurationsdatei in ihrem Home-Verzeichnis, und beim ersten Start der Anwendung kopiert jeder Benutzer diese Datei in den Anwendungsdatenordner des jeweiligen Benutzers. Es wird erwartet, dass die Datei beim ersten Start nicht vorhanden ist.

Wann ist es also akzeptabel, im Voraus zu prüfen, ob eine Datei vorhanden ist (oder andere Attribute wie Größe und Berechtigungen)? Ist es eine ausreichend gute Faustregel, beim ersten Versuch eher einen Fehlschlag als einen Erfolg zu erwarten?

0voto

casperOne Punkte 72238

Dies ist zwar ein sprachunabhängiger Beitrag, aber es scheint, dass Sie über .NET sprechen. Die meisten Systeme (.NET und andere) haben detailliertere APIs, um herauszufinden, ob die Datei beim Öffnen der Datei existiert.

Sie sollten einen Aufruf machen, um auf die Datei zuzugreifen, denn in der Regel wird eine Fehlermeldung angezeigt, dass die Datei nicht existiert (wenn sie wirklich nicht existiert). In .NET müssten Sie die P/Invoke-Schicht durchlaufen und die API-Funktion CreateFile verwenden. Wenn diese Funktion den Fehler ERROR_FILE_NOT_FOUND zurückgibt, dann wissen Sie, dass die Datei nicht existiert. Wenn die Funktion erfolgreich zurückgegeben wird, haben Sie ein Handle, das Sie verwenden können.

Der Punkt hier ist, dass es sich um eine etwas atomarer Betrieb, was letztendlich das ist, wonach Sie suchen.

Mit dem Handle können Sie es dann an einen FileStream-Konstruktor übergeben und Ihre Arbeit an der Datei ausführen.

0 Stimmen

Wenigstens ist die Frage jetzt sprachunabhängig gekennzeichnet. Es macht also nicht viel Sinn, von .NET auszugehen.

0 Stimmen

Nein, er hat ein gutes Argument. Ich komme aus einem .Net-Hintergrund, wobei .Net den Großteil (nicht alles) meiner Erfahrung mit Dateisystem-APIs ausmacht. Allerdings habe ich das Gefühl, das Problem erstreckt sich außerhalb von .Net.

0 Stimmen

@unwind & Joel Coehoorn: Ich habe den Beitrag aktualisiert, um ihn sprachunabhängiger zu machen.

0voto

DNS Punkte 35625

Eine Reihe von Anwendungen enthält integrierte Webserver. Es ist üblich, dass sie beim ersten Start selbstsignierte SSL-Zertifikate generieren. Eine einfache Möglichkeit, dies zu implementieren, wäre zu prüfen, ob das Zertifikat beim Start vorhanden ist, und es zu erstellen, wenn nicht.

Theoretisch könnte sie für den Scheck existieren und später nicht mehr existieren. In diesem Fall würden wir eine Fehlermeldung erhalten, wenn wir versuchen, zuzuhören, aber das kann ganz einfach gehandhabt werden und ist keine große Sache.

Es ist auch möglich, dass er bei der Prüfung nicht vorhanden ist und erst später auftaucht. In diesem Fall wird es entweder mit einem neuen Zertifikat überschrieben, oder das Schreiben des neuen Zertifikats schlägt fehl, je nach Ihrer Richtlinie. Ersteres ist ein wenig ärgerlich, da die Änderung des Zertifikats einen Alarm auslöst, aber auch nicht wirklich kritisch, vor allem, wenn Sie ein wenig protokollieren, was vor sich geht.

Und in der Praxis ist es außerordentlich unwahrscheinlich, dass beide Fälle jemals eintreten.

0 Stimmen

Warum wird geprüft, ob die Datei vorhanden ist, anstatt die Datei einfach zu öffnen, um das Zertifikat und den privaten Schlüssel zu lesen (und den Fehler zu behandeln, wenn das Öffnen fehlschlägt)?

0voto

TalkingCode Punkte 13009

Wie Sie sagten, ist es immer wichtig, was das Programm tun soll, wenn die Datei fehlt. In all meinen Anwendungen kann der Benutzer die Konfigurationsdatei immer löschen und die Anwendung erstellt eine neue mit Standardwerten. Das ist kein Problem. Ich liefere meine Anwendungen auch ohne Konfigurationsdateien aus.

Aber Benutzer neigen dazu, Dateien zu löschen, sogar solche, die sie nicht löschen sollten, wie Serienschlüssel und Vorlagendateien. Ich prüfe immer, ob diese Dateien vorhanden sind, denn ohne sie kann die Anwendung überhaupt nicht laufen. Ich kann keinen neuen Serienschlüssel aus dem Standard erstellen.

Was sollte geschehen, wenn die Datei fehlt? Sie können eine Dateisuche oder einen Exception Handler verwenden, aber die eigentliche Frage ist: Was wird passieren, wenn die Datei fehlt? Oder wie wichtig ist die Datei für die Anwendung. Ich überprüfe die ganze Zeit, bevor ich versuche, auf Support-Dateien für die Anwendung zuzugreifen. Zusätzlich führe ich eine Fehlerbehandlung durch, wenn die Datei beschädigt ist und nicht geladen werden kann.

0voto

Skizz Punkte 66931

Ich denke, der Grund für "Exists" ist es, festzustellen, wenn Dateien fehlen, ohne dass alle für den Zugriff auf die Datei erforderlichen Daten des Betriebssystems erstellt oder Ausnahmen ausgelöst werden müssen. Es handelt sich also eher um eine Optimierung der Dateiverwaltung als um etwas anderes.

Bei einer einzelnen Datei ist die Einsparung, die "Exists" bringt, im Allgemeinen unbedeutend. Wenn Sie prüfen, ob eine Datei viele, viele Male existiert (z. B. bei der Suche nach #include-Dateien), könnte die Einsparung erheblich sein.

In .Net listet die Spezifikation für File.Exists keine Ausnahmen auf, die die Methode auslösen könnte, im Gegensatz zu beispielsweise File.Open, das neun Ausnahmen auflistet, so dass in der ersten Methode sicherlich weniger Überprüfungen stattfinden.

Auch wenn "Exists" true zurückgibt, müssen Sie beim Öffnen der Datei Ausnahmen behandeln, wie die .Net-Referenz vorschlägt.

0voto

sharptooth Punkte 162790

Wir haben ein Diagnosewerkzeug, das eine Reihe von Dateien sammeln muss, darunter auch das Installationsprotokoll. Abhängig von verschiedenen Bedingungen kann sich das Installationsprotokoll in einem von zwei Ordnern befinden. Noch schlimmer ist, dass es in beiden Ordnern unterschiedliche Versionen des Protokolls geben kann. Wie findet das Programm die richtige Version?

Es ist ganz einfach, wenn Sie nachschauen, ob es sie gibt. Wenn nur eine vorhanden ist, nehmen Sie diese Datei. Wenn zwei vorhanden sind, suchen Sie die Datei mit der letzten Änderungszeit und nehmen Sie diese Datei. Das ist der normale Weg, Dinge zu tun.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X