Chcę sprawdzić istnienie pliku ./conf/app.ini
w moim kodzie Go, ale nie mogę znaleźć dobrego sposobu, aby to zrobić.
Wiem, że istnieje metoda File w Javie:, public boolean exists()
która zwraca prawdę, jeśli plik lub katalog istnieje.
Ale jak można to zrobić w Go?
f, err := os.Open(name)
lub,f, err := os.OpenFile(name,os.O_CREATE|os.O_EXCL, mode)
a następnie sprawdźos.IsNotExist(err)
).Odpowiedzi:
// 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 }
Edytowano, aby dodać obsługę błędów.
źródło
panic
dla rzeczywistego obiektu typu „wyjątek”. Możesz „złapać” telefonem dorecover
. Jawne zwracanieerr
jako drugiej wartości zwracanej jest niezwykle powszechną, idiomatyczną techniką Go. Zobacz: golang.org/doc/effective_go.html#errorsif _, err := os.Stat("./conf/app.ini"); err == nil { /*exists*/ } else { /*not exists or some other error*/ }
Możesz użyć tego:
if _, err := os.Stat("./conf/app.ini"); err != nil { if os.IsNotExist(err) { // file does not exist } else { // other error } }
Zobacz: http://golang.org/pkg/os/#IsNotExist
źródło
Bardziej do Twojej wiadomości, ponieważ rozejrzałem się przez kilka minut, myśląc, że moje pytanie będzie szybko odszukane.
To była najpopularniejsza odpowiedź w moich wynikach wyszukiwania, ale tutaj i gdzie indziej rozwiązania zapewniają jedynie sprawdzenie istnienia. Aby sprawdzić, czy
path
reprezentuje istniejący katalog, stwierdziłem, że mogę łatwo:path := GetSomePath(); if stat, err := os.Stat(path); err == nil && stat.IsDir() { // path is a directory }
Część mojego problemu polegała na tym, że spodziewałem się, że
path/filepath
pakiet będzie zawierał funkcję isDir ().źródło
Prosty sposób sprawdzenia, czy plik istnieje, czy nie:
if _, err := os.Stat("/path/to/whatever"); os.IsNotExist(err) { // path/to/whatever does not exist } if _, err := os.Stat("/path/to/whatever"); err == nil { // path/to/whatever exists }
Źródła:
źródło
Używam następującej funkcji, aby sprawdzić moje katalogi pod kątem błędów. Jest bardzo podobny do poprzednich odpowiedzi, ale myślę, że brak zagnieżdżenia
if
s sprawia, że kod jest bardziej przejrzysty. Używago-homedir
do usuwania~
ze ścieżek katalogów ipkg/errors
zwracania ładniejszych komunikatów o błędach, ale byłoby łatwo je usunąć, jeśli nie potrzebujesz ich funkcjonalności.// validateDirectory expands a directory and checks that it exists // it returns the full path to the directory on success // validateDirectory("~/foo") -> ("/home/bbkane/foo", nil) func validateDirectory(dir string) (string, error) { dirPath, err := homedir.Expand(dir) if err != nil { return "", errors.WithStack(err) } info, err := os.Stat(dirPath) if os.IsNotExist(err) { return "", errors.Wrapf(err, "Directory does not exist: %v\n", dirPath) } if err != nil { return "", errors.Wrapf(err, "Directory error: %v\n", dirPath) } if !info.IsDir() { return "", errors.Errorf("Directory is a file, not a directory: %#v\n", dirPath) } return dirPath, nil }
Ponadto, aby powtórzyć komentarz @Dave C, jeśli powodem, dla którego sprawdzasz istnienie katalogu, jest zapisanie w nim pliku, zwykle lepiej po prostu spróbować po prostu spróbować otworzyć go później, aby rozwiązać problem z błędami:
// O_EXCL - used with O_CREATE, file must not exist file, err := os.OpenFile(fileName, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0666) if err != nil { return errors.WithStack(err) } defer file.Close()
źródło
Istnieje prosty sposób sprawdzenia, czy plik istnieje, czy nie:
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 } }
źródło