Die Standardbibliothek von Go verfügt nicht über eine Funktion, mit der ausschließlich überprüft werden soll, ob eine Datei vorhanden ist oder nicht (wie bei Python os.path.exists
). Was ist der idiomatische Weg, um es zu tun?
file
go
standard-library
Sridhar Ratnakumar
quelle
quelle
Antworten:
Um zu überprüfen, ob eine Datei nicht vorhanden ist, entspricht Python
if not os.path.exists(filename)
:So überprüfen Sie, ob eine Datei vorhanden ist, die Python entspricht
if os.path.exists(filename)
:Bearbeitet: gemäß den letzten Kommentaren
quelle
NOTEXIST
zum Beispiel, falls/etc/bashrc
vorhanden, das/etc/bashrc/foobar
wird zurückkehrenENOTDIR
!os.IsNotExist(err)
. Es ist möglich, dass die Datei vorhanden ist, aberos.Stat
aus anderen Gründen fehlschlägt (z. B. Berechtigung, fehlerhafte Festplatte). Wenn Sieerr == nil
als Bedingung verwenden, werden Fehler fälschlicherweise als "Die Datei existiert nicht" kategorisiert.Antwort von Caleb Spare in der Gonuts- Mailingliste.
Entnommen aus: https://groups.google.com/forum/#!msg/golang-nuts/Ayx-BMNdMFo/4rL8FFHr8v4J
quelle
Sie sollten die Funktionen
os.Stat()
undos.IsNotExist()
wie im folgenden Beispiel verwenden:Das Beispiel wird aus extrahiert hier .
quelle
Das Beispiel von user11617 ist falsch; Es wird gemeldet, dass die Datei auch dann vorhanden ist, wenn dies nicht der Fall ist, aber ein anderer Fehler aufgetreten ist.
Die Signatur sollte Exists (Zeichenfolge) sein (Bool, Fehler). Und dann sind die Anrufseiten nicht besser.
Der Code, den er schrieb, wäre besser als:
Aber ich schlage stattdessen Folgendes vor:
quelle
err != nil
statterr == nil
? Wenn es einen Fehler gibt, existiert die Datei wahrscheinlich nicht?Was andere Antworten übersehen haben, ist, dass der Pfad, der der Funktion gegeben wird, tatsächlich ein Verzeichnis sein kann. Die folgende Funktion stellt sicher, dass der Pfad wirklich eine Datei ist.
Noch etwas zu beachten: Dieser Code kann immer noch zu einer Race-Bedingung führen, bei der ein anderer Thread oder Prozess die angegebene Datei löscht oder erstellt, während die Funktion fileExists ausgeführt wird.
Wenn Sie sich darüber Sorgen machen, verwenden Sie eine Sperre in Ihren Threads, serialisieren Sie den Zugriff auf diese Funktion oder verwenden Sie ein prozessübergreifendes Semaphor, wenn mehrere Anwendungen beteiligt sind. Wenn andere Anwendungen beteiligt sind, die außerhalb Ihrer Kontrolle liegen, haben Sie vermutlich kein Glück.
quelle
quelle
Das Funktionsbeispiel:
quelle
Schauen wir uns zunächst einige Aspekte an. Beide Funktionen des
os
Paketsgolang
sind keine Dienstprogramme, sondern Fehlerprüfer. Damit meine ich, dass sie nur ein Wrapper sind, um Fehler auf plattformübergreifenden Fehlern zu behandeln.Also im Grunde , wenn ,
os.Stat
wenn diese Funktion nicht einen Fehler nicht geben , dass die Datei bedeutet , vorhanden ist, wenn es tut müssen Sie überprüfen , was es Art von Fehler ist, hier die Verwendung dieser beiden Funktion kommtos.IsNotExist
undos.IsExist
.Dies kann als
Stat
Fehler beim Auslösen von Dateien verstanden werden, weil er nicht vorhanden ist, oder als Fehler beim Auslösen, weil er vorhanden ist und ein Problem damit vorliegt.Der Parameter, den diese Funktionen annehmen, ist vom Typ
error
, obwohl Sie ihn möglicherweise übergeben können,nil
aber er macht keinen Sinn.Dies weist auch auf die Tatsache hin, dass
IsExist is not same as !IsNotExist
es sich um zwei verschiedene Dinge handelt.Wenn Sie nun wissen möchten, ob eine bestimmte Datei in go vorhanden ist, würde ich den besten Weg bevorzugen:
quelle
Wie in anderen Antworten erwähnt, ist es möglich, das erforderliche Verhalten / die erforderlichen Fehler aus der Verwendung verschiedener Flags mit zu konstruieren
os.OpenFile
. In der Tatos.Create
ist nur eine sinnvolle Standardeinstellung dafür:Sie sollten diese Flags selbst kombinieren, um das Verhalten zu erhalten, an dem Sie interessiert sind:
Je nachdem, was Sie auswählen, werden unterschiedliche Fehler angezeigt.
Hier ist ein Beispiel, in dem ich eine Datei zum Schreiben öffnen möchte, eine vorhandene Datei jedoch nur abschneide, wenn der Benutzer angegeben hat, dass dies in Ordnung ist:
quelle
Der beste Weg, um zu überprüfen, ob eine Datei vorhanden ist:
quelle