Wie prüft man, ob eine Datei in Go existiert?

Go's Standardbibliothek hat keine Funktion, die ausschließlich dazu dient, zu prüfen, ob eine Datei existiert oder nicht (wie Python's os.path.exists). Was ist der idiomatische Weg, dies zu tun?

Lösung

Um zu prüfen, ob eine Datei nicht existiert, äquivalent zu Python's if not os.path.exists(filename):

if _, err := os.Stat("/path/to/whatever"); os.IsNotExist(err) {
  // path/to/whatever does not exist
}

Um zu prüfen, ob eine Datei existiert, äquivalent zu Python's if os.path.exists(filename):

Bearbeitet: nach aktuellen Kommentaren

if _, err := os.Stat("/path/to/whatever"); err == nil {
  // path/to/whatever exists

} else if os.IsNotExist(err) {
  // path/to/whatever does *not* exist

} else {
  // Schrodinger: file may or may not exist. See err for details.

  // Therefore, do *NOT* use !os.IsNotExist(err) to test for file existence

}
Kommentare (4)

Sie sollten die Funktionen os.Stat() und os.IsNotExist() wie im folgenden Beispiel verwenden:

// Exists reports whether the named file or directory exists.
func Exists(name string) bool {
    if _, err := os.Stat(name); err != nil {
        if os.IsNotExist(err) {
            return false
        }
    }
    return true
}

Das Beispiel ist hier entnommen.

Kommentare (1)

Das Beispiel von user11617 ist falsch; es meldet, dass die Datei auch dann existiert, wenn sie nicht existiert, aber ein anderer Fehler vorliegt.

Die Signatur sollte Exists(string) (bool, error) lauten. Und dann sind die Aufrufseiten auch nicht besser.

Der Code, den er geschrieben hat, wäre besser als:

func Exists(name string) bool {
    _, err := os.Stat(name)
    return !os.IsNotExist(err)
}

Aber ich schlage stattdessen Folgendes vor:

func Exists(name string) (bool, error) {
  _, err := os.Stat(name)
  if os.IsNotExist(err) {
    return false, nil
  }
  return err != nil, err
}
Kommentare (3)