web-dev-qa-db-ja.com

Goにファイルが存在するかどうかを確認するにはどうすればいいですか?

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

335

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

if _, err := os.Stat("/path/to/whatever"); os.IsNotExist(err) {
  // 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 os.IsNotExist(err) {
  // 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


}
591

Caleb Spare で答えて gonuts メーリングリストに投稿。

[...]実際にはそれほど頻繁には必要とされず、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

107
OscarRyz

次の例のように、os.Stat()およびos.IsNotExist()関数を使用してください。

// Exists reports whether the named file or directory exists.
func Exists(name string) bool {
    if _, err := os.Stat(name); err != nil {
        if os.IsNotExist(err) {
            return false
        }
    }
    return true
}

例は here から抽出されます。

24
user11617

User11617による の例 は正しくありません。ファイルが存在しない場合でもファイルが存在することを報告しますが、他の種類のエラーがありました。

シグネチャはExists(string)であるべきです(ブール値、エラー)。そして、それが起こるにつれて、コールサイトはそれ以上良くありません。

彼が書いたコードは以下のようになります。

func Exists(name string) bool {
    _, err := os.Stat(name)
    return !os.IsNotExist(err)
}

しかし、私は代わりにこれを提案します:

func Exists(name string) (bool, error) {
  _, err := os.Stat(name)
  if os.IsNotExist(err) {
    return false, nil
  }
  return err != nil, err
}
12
user3431012
    _, err := os.Stat(file)
    if err == nil {
        log.Printf("file %s exists", file)
    } else if os.IsNotExist(err) {
        log.Printf("file %s not exists", file)
    } else {
        log.Printf("file %s stat error: %v", file, err)
    }
9
tangxinfa

機能の例:

func file_is_exists(f string) bool {
    _, err := os.Stat(f)
    if os.IsNotExist(err) {
        return false
    }
    return err == nil
}
6
honmaple

まずいくつかの側面を見てみましょう。osgolangパッケージによって提供される関数はどちらもユーティリティではなくエラーチェッカーです。つまり、クロスプラットフォームでエラーを処理するためのラッパーにすぎません。

そのため、基本的にos.Statがこのエラーでエラーが発生しない場合は、ファイルが存在するという意味です。エラーの種類を確認する必要がある場合は、これら2つの関数os.IsNotExistおよびos.IsExistを使用します。

これは、ファイルがスローされないために発生するエラーのStat、または存在しているためにエラーが発生するために発生するエラーです。

これらの関数が取るパラメータはerror型ですが、nilを渡すことはできますが意味がありません。

これはIsExist is not same as !IsNotExistという2つの方法が異なることも示しています。

だから今あなたが与えられたファイルが移動中に存在するかどうかを知りたいのなら、私は最善の方法が好きだろう:

if _, err := os.Stat(path/to/file); !os.IsNotExist(err){
   //TODO
} 
3
Farhaan Bukhsh