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

huangapple go评论84阅读模式
英文:

How to check whether a file or directory exists?

问题

我想在我的Go代码中检查文件./conf/app.ini是否存在,但是我找不到一个好的方法来做到这一点。

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

但是在Go中如何实现这个功能呢?

英文:

I want to check the existence of file ./conf/app.ini in my Go code,
but I can't find a good way to do that.

I know there is a method of File in Java: public boolean exists(), which returns true if the file or directory exists.

But how can this be done in Go?

答案1

得分: 255

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

添加错误处理。

英文:
// 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
}

Edited to add error handling.

答案2

得分: 143

你可以使用以下代码:

if _, err := os.Stat("./conf/app.ini"); err != nil {
    if os.IsNotExist(err) {
        // 文件不存在
    } else {
        // 其他错误
    }
}

参考:http://golang.org/pkg/os/#IsNotExist

英文:

You can use this :

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

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

答案3

得分: 37

更多的是提供信息,因为我花了几分钟在周围寻找,以为我的问题可以很快通过搜索解决。

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

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

path := GetSomePath();
if stat, err := os.Stat(path); err == nil && stat.IsDir() {
    // path是一个目录
}

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

英文:

More of an FYI, since I looked around for a few minutes thinking my question be a quick search away.

> How to check if path represents an existing directory in Go?

This was the most popular answer in my search results, but here and elsewhere the solutions only provide existence check. To check if path represents an existing directory, I found I could easily:

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

Part of my problem was that I expected path/filepath package to contain the isDir() function.

答案4

得分: 19

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

if _, err := os.Stat("/path/to/whatever"); os.IsNotExist(err) {
    // path/to/whatever 不存在
}

if _, err := os.Stat("/path/to/whatever"); err == nil {
    // path/to/whatever 存在
}

来源:

英文:

Simple way to check whether file exists or not:

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
}

Sources:

答案5

得分: 1

我使用以下函数来检查我的目录是否有任何错误。它与之前的答案非常相似,但我认为不嵌套if语句可以使代码更清晰。它使用go-homedir来从目录路径中删除~,并使用pkg/errors返回更好的错误消息,但如果您不需要它们的功能,很容易将它们移除。

// validateDirectory扩展目录并检查其是否存在
// 成功时返回目录的完整路径
// 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, "目录不存在:%v\n", dirPath)
    }
    if err != nil {
        return "", errors.Wrapf(err, "目录错误:%v\n", dirPath)

    }
    if !info.IsDir() {
        return "", errors.Errorf("目录是一个文件,而不是一个目录:%#v\n", dirPath)
    }
    return dirPath, nil
}

另外,重复一下@Dave C的评论,如果您检查目录是否存在的原因是为了将文件写入其中,通常最好只是尝试打开它并在之后处理错误:

// O_EXCL - 与O_CREATE一起使用,文件不能存在
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()
英文:

I use the following function to check my directories for any errors. It's very similar to previous answers, but I think not nesting ifs makes the code more clear. It uses go-homedir to remove ~ from directory paths and pkg/errors to return nicer error messages, but it would be easy to take them out if you don't need their functionality.

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

Also, to repeat @Dave C's comment, if the reason you're checking a directory's existence is to write a file into it, it's usually better to simply try to open it an deal with errors afterwards:

// 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()

答案6

得分: -4

有一种简单的方法来检查你的文件是否存在:

如果 _, err := os.Stat("./conf/app.ini"); err != nil {
    如果 os.IsNotExist(err) {
        ..... // 如果文件不存在,显示错误
    } else {
       ..... // 如果文件存在,显示成功消息
    }
}
英文:

There is simple way to check whether your file exists or not:

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

huangapple
  • 本文由 发表于 2012年5月9日 14:12:59
  • 转载请务必保留本文链接:https://go.coder-hub.com/10510691.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定