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

Joel Coehoorn Punkte 377088

Um meine eigene Frage (teilweise) zu beantworten, möchte ich das von mir verwendete Beispiel, eine Standardkonfigurationsdatei, näher erläutern.

Anstatt zu prüfen, ob die Datei beim Start der Anwendung vorhanden ist, und zu versuchen, die Datei zu kopieren, wenn die Prüfung fehlschlägt, sollte man Folgendes tun immer versuchen Sie, die Datei zu kopieren. Sie müssen nur dafür sorgen, dass der Kopiervorgang fehlschlägt, wenn die Datei bereits existiert, anstatt eine vorhandene Datei zu ersetzen. Auf diese Weise müssen Sie nur eine Ausnahme abfangen und ignorieren, die ausgelöst wird, wenn das Kopieren aufgrund einer vorhandenen Datei fehlschlägt.

0voto

MichaelICE Punkte 9777

Ihr Problem könnte leicht mit den Grundlagen der Informatik gelöst werden... lesen Sie mehr über Semaphoren .

(Ich wollte nicht wie ein Idiot klingen, ich wollte Sie nur auf eine einfache Lösung für ein häufiges Problem hinweisen).

0voto

Paul Tomblin Punkte 172816

Wenn Sie so besorgt darüber sind, dass jemand anderes die Datei entfernt, sollten Sie vielleicht eine Art Sperrsystem einrichten. Ich habe zum Beispiel an dem Code für C-News, einem Usenet-News-Server, gearbeitet. Da viele Vorgänge asynchron ablaufen konnten, wurde eine Datei oder ein Verzeichnis "gesperrt", indem eine temporäre Datei angelegt wurde, die dann mit einer Datei namens "LOCK" fest verknüpft wurde. Wenn der Link fehlschlug, bedeutete das, dass eine andere Version des Programms in dieses Verzeichnis schrieb, ansonsten gehörte es Ihnen und Sie konnten tun, was Sie wollten.

Das Schöne daran ist, dass der größte Teil des Programms in Shell und awk geschrieben war, und dies war ein sehr portabler Sperrmechanismus. Außerdem enthielt die Sperrdatei die PID des Besitzers, so dass man in der vorhandenen Sperrdatei nachsehen konnte, ob der Besitzer noch aktiv war.

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