如何检查文件或目录是否存在?

我想检查文件 ./conf/app.ini在我的围棋代码中的存在, 但我找不到一个好办法。

我知道 Java 中有一个 File 方法: public boolean exists(),如果文件或目录存在,它将返回 true。

但是在 Go 中如何做到这一点呢?

119683 次浏览

你可以用这个:

if _, err := os.Stat("./conf/app.ini"); err != nil {
if os.IsNotExist(err) {
// file does not exist
} else {
// other error
}
}

见: http://golang.org/pkg/os/#IsNotExist

// 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
}

编辑以添加错误处理。

仅供参考,因为我环顾四周几分钟,认为我的问题是一个快速搜索离开。

如何检查路径是否表示 Go 中的现有目录?

这是在我的搜索结果中最受欢迎的答案,但在这里和其他地方的解决方案只提供存在性检查。为了检查 path是否代表一个现有的目录,我发现我可以很容易地:

path := GetSomePath();
if stat, err := os.Stat(path); err == nil && stat.IsDir() {
// path is a directory
}

我的部分问题是我期望 path/filepath包包含 isDir ()函数。

有一个简单的方法可以检查你的文件是否存在:

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
}
}

检查文件是否存在的简单方法:

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
}

资料来源:

我使用以下函数检查我的目录中是否有错误。这与以前的答案非常相似,但是我认为不嵌套 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()