我想检查Go代码中是否存在文件./conf/app.ini
,但我找不到一个好方法。
我知道在Java语言中有一个文件的方法:public boolean exists()
,如果文件或目录存在,它将返回true。
但是在Go中如何做到这一点呢?
发布于 2012-05-09 14:23:12
// 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
}
已编辑以添加错误处理。
发布于 2012-05-09 14:15:37
您可以使用以下命令:
if _, err := os.Stat("./conf/app.ini"); err != nil {
if os.IsNotExist(err) {
// file does not exist
} else {
// other error
}
}
发布于 2020-10-31 06:14:22
我使用以下函数来检查我的目录中是否有任何错误。它与前面的答案非常相似,但我认为不嵌套if
s会使代码更清晰。它使用go-homedir
从目录路径中删除~
,使用pkg/errors
返回更好的错误消息,但如果您不需要它们的功能,则很容易将它们删除。
// 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
}
此外,重复@Dave C的评论,如果您检查目录是否存在的原因是将文件写入其中,那么通常更好的做法是在之后尝试打开它并处理错误:
// 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()
https://stackoverflow.com/questions/10510691
复制相似问题