ファイルまたはディレクトリが存在するかどうかを確認するにはどうすればよいですか?


131

./conf/app.iniGoコード内のファイルの存在を確認したいのですが、それを行う良い方法が見つかりません。

File in Java:のメソッドがあることを知ってpublic boolean exists()います。これは、ファイルまたはディレクトリが存在する場合にtrueを返します。

しかし、これはGoでどのように実行できますか?


7
また、この情報の使用方法によっては、競合状態が発生することにも注意してください。言うことができるのは、少し前にファイルが存在した/存在しなかったということです。あなたがテストに取り組む時までには、反対が真であるかもしれません。通常、それはあなたがするつもりどんな操作しながら確認するために非常に良いでしょう(例えば、既存の開いたり、新しいファイルを作成する前に確認したが実行しないf, err := os.Open(name)か、f, err := os.OpenFile(name,os.O_CREATE|os.O_EXCL, mode)してから確認してくださいos.IsNotExist(err))。
Dave C、

回答:


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

エラー処理を追加するために編集されました。


4
私には「例外プログラミング」のように見えます。この種のコードを公式の#golangパラダイムとして正当化するリソースはありますか?
Olivier Amblet 2012年

21
@OlivierAmbletここで起こっている例外はありません。Goはpanic、実際の「例外」のようなオブジェクトに使用します。への呼び出しで「キャッチ」できrecoverます。err2番目の戻り値として明示的にを返すことは、非常に一般的な慣用的なGoテクニックです。参照:golang.org/doc/effective_go.html#errors
Chris Pfohl

13
解決策はそれほど単純ではなく、特別です
zhaozhi '17年

1
それは何のブール関数を存在しますが、あなただけのファイルの存在を確認したい場合は、アプリケーション・コードが簡単になることができますが存在しないというのは本当だ:if _, err := os.Stat("./conf/app.ini"); err == nil { /*exists*/ } else { /*not exists or some other error*/ }
トビア

11
なぜこの言語のすべてがそれほど複雑なのですか?
トップキャット

123

あなたはこれを使うことができます:

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


6
これは受け入れられた回答よりも優れていますが、else句は本当に必要ですか?
Sergey Koulikov 2013年

9
@SergeyKoulikov許可エラーなど、他のエラーが発生する可能性があります。
DenysSéguret2013年

22

私の質問はすぐに検索できると思って数分間周りを見回したので、参考までに。

パスがGoの既存のディレクトリを表すかどうかを確認する方法

これは私の検索結果で最も人気のある回答でしたが、ここや他の場所ではソリューションは存在チェックのみを提供します。path既存のディレクトリを表すかどうかを確認するために、簡単に次のことができることがわかりました。

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

私の問題の一部は、path/filepathパッケージにisDir()関数が含まれることを期待していたことでした。



-2

ファイルが存在するかどうかを確認する簡単な方法があります:

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

これはDenysSéguretによる回答の複製です。
StardustGogeta
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.