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żywa go-homedir
do usuwania ~
ze ścieżek katalogów i pkg/errors
zwracania ładniejszych komunikatów o błędach, ale byłoby łatwo je usunąć, jeśli nie potrzebujesz ich funkcjonalności.
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:
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()
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)
).