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?

HardPass
quelle
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.

Mostafa
quelle
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
123

Sie können dies verwenden:

if _, err := os.Stat("./conf/app.ini"); err != nil {
    if os.IsNotExist(err) {
        // file does not exist
    } else {
        // other error
    }
}

Siehe: http://golang.org/pkg/os/#IsNotExist

Denys Séguret
quelle
6
Dies ist besser als die akzeptierte Antwort, aber ist die else-Klausel wirklich notwendig?
Sergey Koulikov
9
@SergeyKoulikov Es können andere Fehler auftreten, z. B. eine Berechtigung.
Denys Séguret
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.

Edward Wagner
quelle
-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
    }
}
Kabeer Shaikh
quelle
Dies ist ein Duplikat der Antwort von Denys Séguret.
StardustGogeta