563

Go の標準ライブラリには、ファイルが存在するかどうかを確認することだけを目的とした関数はありません (Python の のようにos.path.exists)。それを行う慣用的な方法は何ですか?

4

13 に答える 13

872

ファイルが存在しないかどうかを確認するには、Python の と同等ですif not os.path.exists(filename)

if _, err := os.Stat("/path/to/whatever"); errors.Is(err, os.ErrNotExist) {
  // path/to/whatever does not exist
}

ファイルが存在するかどうかを確認するには、Python の と同等ですif os.path.exists(filename)

編集済み: 最近のコメントごと

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

} else if errors.Is(err, os.ErrNotExist) {
  // path/to/whatever does *not* exist

} else {
  // Schrodinger: file may or may not exist. See err for details.

  // Therefore, do *NOT* use !os.IsNotExist(err) to test for file existence


}
于 2012-09-20T18:42:02.137 に答える
148

gonutsメーリングリストに投稿されたCaleb Spareによる回答。

[...] 実際にはあまり必要とされませんが、[...] 必要なos.Stat場合に使用するのは簡単です。

[...] たとえば、ファイルを開く場合、最初にファイルが存在するかどうかを確認する必要はありません。チェックとオープンの間にファイルが消える可能性があります。とにかく、os.Openエラーをチェックする必要があります。したがってos.IsNotExist(err)、ファイルを開こうとした後に呼び出すだけで、ファイルが存在しない場合に対処できます (特別な処理が必要な場合)。

[...] 存在するパスを確認する必要はまったくありません (すべきではありません)。

  • os.MkdirAllパスが既に存在するかどうかに関係なく機能します。(また、その呼び出しからのエラーを確認する必要があります。)

  • を使用する代わりに、 を使用os.Createする必要がありますos.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0666)。そうすれば、ファイルが既に存在する場合にエラーが発生します。また、事前に存在をチェックするバージョンとは異なり、これにはファイルを作成する他の何かとの競合状態はありません。

出典: https://groups.google.com/forum/#!msg/golang-nuts/Ayx-BMNdMFo/4rL8FFHr8v4J

于 2014-03-18T14:54:36.450 に答える
49

次の例のように、 関数os.Stat()と関数を使用する必要があります。os.IsNotExist()

func Exists(name string) (bool, error) {
    _, err := os.Stat(name)
    if err == nil {
        return true, nil
    }
    if errors.Is(err, os.ErrNotExist) {
        return false, nil
    }
    return false, err
}

edit1: 特定の状況下で true を返す問題を修正しました。
edit2:os.IsNotExist()からerrors.Is()を使用するように切り替えました。これは多くの人がベストプラクティスであり、ここにあると言います

于 2012-09-21T09:10:44.313 に答える
7

ファイルが存在するかどうかを確認する最良の方法:

if _, err := os.Stat("/path/to/file"); err == nil || os.IsExist(err) {
    // your code here if file exists
}
于 2020-05-20T18:51:17.793 に答える