我想检查Go代码中是否存在文件./conf/app.ini
,
但我找不到一个很好的方法来做到这一点。
我知道Java中有一个File方法:public boolean exists()
,如果文件或目录存在,则返回true。
但是怎么能在Go中完成呢?
答案 0 :(得分:163)
// 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 true, err
}
编辑添加错误处理。
答案 1 :(得分:111)
您可以使用:
if _, err := os.Stat("./conf/app.ini"); err != nil {
if os.IsNotExist(err) {
// file does not exist
} else {
// other error
}
}
答案 2 :(得分:16)
更多的一个FYI,因为我环顾了几分钟,认为我的问题是一个快速搜索。
如何检查路径是否代表Go中的现有目录?
这是我搜索结果中最受欢迎的答案,但此处和其他地方的解决方案仅提供存在检查。要检查path
是否代表现有目录,我发现我可以轻松地:
path := GetSomePath();
if stat, err := os.Stat(path); err == nil && stat.IsDir() {
// path is a directory
}
我的部分问题是我希望path/filepath
包中包含isDir()函数。
答案 3 :(得分:8)
检查文件是否存在的简单方法:
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
}
来源:
答案 4 :(得分:0)
我使用以下功能检查我的目录中是否有错误。它与以前的答案非常相似,但是我认为不嵌套if
可以使代码更清晰。它使用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()
答案 5 :(得分:-1)
有一种简单的方法可以检查您的文件是否存在:
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
}
}