Goの標準ライブラリには、ファイルが存在するかどうかをチェックすることだけを目的とした関数はありません(Pythonの os.path.exists
のように)。 慣用句 それを行う方法は何ですか?
ファイルが存在しないかどうかを調べるには、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
}
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
次の例のように、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 から抽出されます。
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
}
_, 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)
}
機能の例:
func file_is_exists(f string) bool {
_, err := os.Stat(f)
if os.IsNotExist(err) {
return false
}
return err == nil
}
まずいくつかの側面を見てみましょう。os
のgolang
パッケージによって提供される関数はどちらもユーティリティではなくエラーチェッカーです。つまり、クロスプラットフォームでエラーを処理するためのラッパーにすぎません。
そのため、基本的に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
}