Jak sprawdzić, czy plik istnieje w Go?

Standardowa biblioteka Go nie ma funkcji przeznaczonej wyłącznie do sprawdzania, czy plik istnieje, czy nie (jak w Pythonie os.path.exists). Jaki jestidiomatyczny sposób na to?

Author: Sridhar Ratnakumar, 2012-09-20

7 answers

Aby sprawdzić, czy plik nie istnieje, odpowiednik if not os.path.exists(filename) Pythona:

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

Aby sprawdzić, czy plik istnieje, odpowiednik if os.path.exists(filename) Pythona:

if _, err := os.Stat("/path/to/whatever"); !os.IsNotExist(err) {
  // path/to/whatever exists
}
 496
Author: Sridhar Ratnakumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-23 00:44:03

Odpowiedź przez posted in gonuts Lista dyskusyjna.

[...] Nie jest tak naprawdę potrzebny bardzo często i [...] using os.Stat is wystarczająco łatwe w przypadkach, w których jest to wymagane.

[...] Na przykład: jeśli zamierzasz otworzyć plik, nie ma powodu, aby najpierw sprawdzić, czy istnieje. Plik może zniknąć pomiędzy sprawdzeniem A otwarciem, i tak musisz sprawdzić błąd os.Open niezależnie od tego. Więc po prostu zadzwoń os.IsNotExist(err) po spróbuj aby otworzyć plik i poradzić sobie z jego nieistnieniem (jeśli wymaga to specjalnej obsługi).

[...] Nie musisz w ogóle sprawdzać istniejących ścieżek (i nie powinieneś).

  • os.MkdirAll działa niezależnie od tego, czy ścieżki już istnieją. (Musisz również sprawdzić błąd z tego połączenia.)

  • Zamiast używać os.Create, należy użyć os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0666). W ten sposób pojawi się błąd, jeśli plik już istnieje. Również to nie ma wyścigu warunek z czymś innym, co tworzy plik, w przeciwieństwie do wersji, która sprawdza istnienie wcześniej.

Pobrano z: https://groups.google.com/forum/#! msg / golang-nuts/Ayx-BMNdMFo / 4rL8FFHr8v4J

 91
Author: OscarRyz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-24 13:03:34

Powinieneś używać funkcji os.Stat() i os.IsNotExist() jak w poniższym przykładzie:

// 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
}

Przykład pochodzi z tutaj .

 21
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-21 09:10:44
    _, err := os.Stat(file)
    if err == nil {
        log.Printf("file %s exists", file)
    } else if os.IsNotExist(err) {
        log.Printf("file %s not exists", file)
    } else {
        log.Printf("file %s stat error: %v", file, err)
    }
 7
Author: tangxinfa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-29 02:58:11

Przykład napisany przez user11617 jest nieprawidłowy; zgłosi, że plik istnieje nawet w przypadkach, gdy nie istnieje, ale wystąpił błąd innego rodzaju.

Sygnatura powinna być Exists (string) (bool, error). A potem, jak to się dzieje, strony połączeń nie są lepsze.

Kod, który napisał, byłby lepszy jako:

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

Ale zamiast tego proponuję:

func Exists(name string) (bool, error) {
  err := os.Stat(name)
  if os.IsNotExist(err) {
    return false, nil
  }
  return err != nil, err
}
 5
Author: user3431012,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:54

Przykład funkcji:

func file_is_exists(f string) bool {
    _, err := os.Stat(f)
    if os.IsNotExist(err) {
        return false
    }
    return err == nil
}
 5
Author: honmaple,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-11 05:51:52

Spójrzmy najpierw na kilka aspektów, zarówno funkcja dostarczana przez os pakiet golang nie są narzędziami, ale sprawdzaczami błędów, co mam na myśli mówiąc, że są one po prostu opakowaniem do obsługi błędów na różnych platformach.

Więc w zasadzie Jeśli {[3] } Jeśli ta funkcja nie daje żadnego błędu, który oznacza, że plik istnieje, jeśli musisz sprawdzić, jaki to jest błąd, tutaj przychodzi użycie tych dwóch funkcji os.IsNotExist i os.IsExist.

Można to rozumieć jako Stat pliku błąd rzucania, ponieważ nie istnieje lub jest to błąd rzucania, ponieważ istnieje i jest z nim jakiś problem.

Parametr, który przyjmują te funkcje, jest typu error, chociaż możesz być w stanie przekazać nil do niego, ale nie miałoby to sensu.

To również wskazuje na fakt, że są to dwie różne rzeczy.

Więc teraz, jeśli chcesz wiedzieć, czy dany plik istnieje w go, wolałbym, aby najlepszym sposobem było:

if _, err := os.Stat(path/to/file); !os.IsNotExist(err){
   //TODO
} 
 3
Author: Farhaan Bukhsh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-18 06:47:37