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?
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
}
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
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 .
_, 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)
}
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
}
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
}
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.
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
}
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