Wie überprüfe ich, ob eine Datei oder ein Verzeichnis vorhanden ist?


131

Ich möchte die Existenz einer Datei ./conf/app.iniin meinem Go-Code überprüfen , finde aber keinen guten Weg, dies zu tun.

Ich weiß, dass es in Java eine Dateimethode gibt:, public boolean exists()die true zurückgibt, wenn die Datei oder das Verzeichnis vorhanden ist.

Aber wie geht das in Go?


7
Beachten Sie auch, dass Sie je nach Verwendung dieser Informationen eine Rennbedingung haben. Alles, was Sie sagen können, ist, dass die Datei vor einiger Zeit nicht existierte. Wenn Sie den Test durchführen, kann das Gegenteil der Fall sein. Normalerweise ist es viel besser zu überprüfen, während Sie den Vorgang ausführen, den Sie beabsichtigen (z. B. nicht überprüfen, bevor Sie eine vorhandene Datei öffnen oder eine neue Datei erstellen, sondern tun f, err := os.Open(name)oder f, err := os.OpenFile(name,os.O_CREATE|os.O_EXCL, mode)und dann überprüfen os.IsNotExist(err)).
Dave C

Antworten:


189
// exists returns whether the given file or directory exists
func exists(path string) (bool, error) {
    _, err := os.Stat(path)
    if err == nil { return true, nil }
    if os.IsNotExist(err) { return false, nil }
    return false, err
}

Bearbeitet, um Fehlerbehandlung hinzuzufügen.


4
Es sieht für mich nach 'Ausnahmeprogrammierung' aus. Gibt es eine Ressource, die diese Art von Code als offizielles # Golang-Paradigma rechtfertigt?
Olivier Amblet

21
@OlivierAmblet Hier gibt es keine Ausnahme. Go verwendet panicfür ein tatsächliches "Ausnahme" -ähnliches Objekt. Sie können mit einem Anruf an "fangen" recover. Die explizite Rückgabe eines errWertes als zweiten Rückgabewert ist eine äußerst verbreitete, idiomatische Go-Technik. Siehe: golang.org/doc/effective_go.html#errors
Chris Pfohl

13
Die Lösung ist nicht sehr einfach, gehen ist etwas Besonderes
Zhaozhi

1
Es ist wahr, dass es keine boolesche Exists-Funktion gibt, aber der Anwendungscode kann einfacher sein, wenn Sie nur die Existenz einer Datei überprüfen möchten:if _, err := os.Stat("./conf/app.ini"); err == nil { /*exists*/ } else { /*not exists or some other error*/ }
Tobia

11
Warum ist alles in dieser Sprache so kompliziert?
Top Cat


22

Eher zu Ihrer Information, da ich mich ein paar Minuten umgesehen habe und dachte, meine Frage sei eine schnelle Suche entfernt.

Wie überprüfe ich, ob der Pfad ein vorhandenes Verzeichnis in Go darstellt?

Dies war die beliebteste Antwort in meinen Suchergebnissen, aber hier und anderswo bieten die Lösungen nur eine Existenzprüfung. Um zu überprüfen, ob es sich pathum ein vorhandenes Verzeichnis handelt, stellte ich fest, dass ich leicht:

path := GetSomePath();
if stat, err := os.Stat(path); err == nil && stat.IsDir() {
    // path is a directory
}

Ein Teil meines Problems war, dass ich erwartet hatte path/filepath, dass das Paket die Funktion isDir () enthält.



-2

Es gibt eine einfache Möglichkeit, um zu überprüfen, ob Ihre Datei vorhanden ist oder nicht:

if _, err := os.Stat("./conf/app.ini"); err != nil {
    if os.IsNotExist(err) {
        ..... //Shows error if file not exists
    } else {
       ..... // Shows success message like file is there
    }
}

Dies ist ein Duplikat der Antwort von Denys Séguret.
StardustGogeta
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.