Go'da bir dosyanın var olup olmadığı nasıl kontrol edilir?

Go'nun standart kütüphanesinde yalnızca bir dosyanın var olup olmadığını kontrol etmek için tasarlanmış bir fonksiyon yoktur (Python'daki os.path.exists gibi). Bunu yapmanın idiomatik yolu nedir?

Çözüm

Bir dosyanın var olup olmadığını kontrol etmek için, Python'un if not os.path.exists(filename) komutuna eşdeğerdir:

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

Bir dosyanın var olup olmadığını kontrol etmek için, Python'un if os.path.exists(filename) komutuna eşdeğerdir:

Düzenlendi: son yorumlara göre

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

}
Yorumlar (4)

Aşağıdaki örnekte olduğu gibi os.Stat() ve os.IsNotExist() fonksiyonlarını kullanmalısınız:

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

Örnek burada'den alınmıştır.

Yorumlar (1)

user11617]1 tarafından verilen örnek yanlıştır; dosyanın var olmadığı durumlarda bile dosyanın var olduğunu, ancak başka bir tür hata olduğunu bildirecektir.

İmza Exists(string) (bool, error) şeklinde olmalıdır. Ve sonra, olduğu gibi, çağrı siteleri daha iyi değildir.

Yazdığı kod şöyle olsa daha iyi olur:

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

Ama ben bunun yerine şunu öneriyorum:

func Exists(name string) (bool, error) {
  _, err := os.Stat(name)
  if os.IsNotExist(err) {
    return false, nil
  }
  return err != nil, err
}
Yorumlar (3)