Standardowa biblioteka Go nie ma funkcji służącej wyłącznie do sprawdzania, czy plik istnieje, czy nie (takiej jak Python os.path.exists
). Jak idiomatyczny sposób to zrobić?
file
go
standard-library
Sridhar Ratnakumar
źródło
źródło
Odpowiedzi:
Aby sprawdzić, czy plik nie istnieje, odpowiednik Pythona
if not os.path.exists(filename)
:Aby sprawdzić, czy plik istnieje, odpowiednik Pythona
if os.path.exists(filename)
:Edytowane: według ostatnich komentarzy
źródło
NOTEXIST
, na przykład, jeśli/etc/bashrc
istnieje,/etc/bashrc/foobar
zwróciENOTDIR
!os.IsNotExist(err)
. Możliwe, że plik istnieje, aleos.Stat
nie działa z innych powodów (np. Pozwolenie, awaria dysku). Użycieerr == nil
jako warunku niepoprawnie klasyfikuje takie awarie jako „plik nie istnieje”.Odpowiedz przez Caleb Spare opublikowany na liście mailingowej gonuts .
Zaczerpnięte z: https://groups.google.com/forum/#!msg/golang-nuts/Ayx-BMNdMFo/4rL8FFHr8v4J
źródło
Należy użyć funkcji
os.Stat()
i,os.IsNotExist()
jak w poniższym przykładzie:Przykład został wyciągnięty stąd .
źródło
Przykład przez user11617 jest nieprawidłowe; zgłosi, że plik istnieje nawet w przypadkach, w których go nie ma, ale wystąpił błąd innego rodzaju.
Podpis powinien mieć postać Exists (string) (bool, error). A potem, jak to się dzieje, strony połączeń nie są lepsze.
Kod, który napisał, byłby lepszy jako:
Ale proponuję to zamiast tego:
źródło
err != nil
zamiasterr == nil
? Jeśli wystąpił błąd, plik prawdopodobnie nie istnieje?Inne pominięte odpowiedzi to to, że ścieżka podana do funkcji może być katalogiem. Poniższa funkcja zapewnia, że ścieżka jest tak naprawdę plikiem.
Kolejna rzecz, na którą należy zwrócić uwagę: ten kod może nadal prowadzić do wyścigu, w którym inny wątek lub proces usuwa lub tworzy określony plik, gdy funkcja fileExists jest uruchomiona.
Jeśli martwisz się tym, użyj blokady w wątkach, szereguj dostęp do tej funkcji lub skorzystaj z semafora między procesami, jeśli zaangażowanych jest wiele aplikacji. Jeśli w grę wchodzą inne aplikacje, poza twoją kontrolą, nie masz szczęścia.
źródło
źródło
Przykład funkcji:
źródło
Spójrzmy najpierw na kilka aspektów, obie funkcje dostarczane przez
os
pakietgolang
nie są narzędziami, ale narzędziami do sprawdzania błędów, co mam na myśli to, że są one tylko opakowaniem do obsługi błędów na różnych platformach.Zasadniczo, jeśli
os.Stat
jeśli ta funkcja nie daje żadnego błędu, oznacza to, że plik istnieje, jeśli musisz sprawdzić, jaki to jest błąd, oto użycie tych dwóch funkcjios.IsNotExist
ios.IsExist
.Można to rozumieć jako
Stat
błąd zgłaszania pliku, ponieważ nie istnieje lub jest to błąd zgłaszania, ponieważ istnieje i jest z nim jakiś problem.Parametr, który te funkcje przyjmują, jest typem
error
, chociaż możesz być w stanie przekazaćnil
, ale nie ma to sensu.Wskazuje to również na fakt
IsExist is not same as !IsNotExist
, że są to dwie różne rzeczy.Więc jeśli chcesz wiedzieć, czy dany plik istnieje w go, wolałbym najlepiej:
źródło
Jak wspomniano w innych odpowiedziach, możliwe jest skonstruowanie wymaganego zachowania / błędów przy użyciu różnych flag z
os.OpenFile
. W rzeczywistościos.Create
jest to po prostu rozsądny skrót do robienia tego:Powinieneś sam połączyć te flagi, aby uzyskać interesujące Cię zachowanie:
W zależności od tego, co wybierzesz, będziesz otrzymywać różne błędy.
Oto przykład, w którym chcę otworzyć plik do zapisu, ale obetnę istniejący plik tylko wtedy, gdy użytkownik powie, że jest OK:
źródło
Najlepszy sposób sprawdzenia, czy plik istnieje:
źródło