Bagaimana untuk memeriksa apakah file ada di Pergi?

Pergi's perpustakaan standar tidak memiliki fungsi semata-mata dimaksudkan untuk memeriksa apakah sebuah file ada atau tidak (seperti Python's os.jalan.ada). Apa idiomatic cara untuk melakukannya?

Mengomentari pertanyaan (5)
Larutan

Untuk memeriksa apakah file doesn't ada, setara dengan Python's jika bukan os.jalan.ada(filename):

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

Untuk memeriksa apakah sebuah file ada atau setara dengan Python's jika os.jalan.ada(filename):

Edited: per komentar terbaru

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

}
Komentar (4)

Jawaban oleh Caleb Cadang posted in gonuts mailing list.

[...] It's tidak benar-benar dibutuhkan sangat sering dan [...] menggunakan os.Stat adalah cukup mudah untuk kasus-kasus di mana diperlukan.

[...] sebagai contoh: jika anda akan membuka file, ada's tidak ada alasan untuk memeriksa apakah itu ada lebih dulu. File bisa hilang di antara pemeriksaan dan pembukaan, dan tetap anda'll perlu memeriksa os.Buka kesalahan terlepas. Jadi anda cukup memanggil os.IsNotExist(err) setelah anda mencoba untuk membuka file, dan berurusan dengan non-eksistensi di sana (jika yang memerlukan penanganan khusus).

[...] Anda don't perlu untuk memeriksa jalan yang ada di semua (dan seharusnya kau't).

  • os.MkdirAll bekerja atau tidaknya jalan yang sudah ada. (Anda juga perlu memeriksa kesalahan dari panggilan itu.)
  • alih-Alih menggunakan os.Membuat, anda harus menggunakanos.OpenFile(jalan, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0666)` . Dengan cara itu anda'll mendapatkan error jika file sudah ada. Juga ini doesn't memiliki kondisi balapan dengan sesuatu yang lain membuat file, tidak seperti versi yang memeriksa keberadaan terlebih dahulu.

Diambil dari: https://groups.google.com/forum/#!msg/golang-kacang-kacangan/Ayx-BMNdMFo/4rL8FFHr8v4J

Komentar (0)

Anda harus menggunakan os.Stat() dan os.IsNotExist() fungsi seperti dalam contoh berikut:

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

Contoh ini diambil dari sini.

Komentar (1)

Contoh oleh user11617 adalah salah; itu akan melaporkan bahwa file yang ada bahkan dalam kasus di mana tidak, tapi ada kesalahan dari beberapa jenis lain.

Tanda tangan harus Ada(string) (bool, error). Dan kemudian, saat hal itu terjadi, hubungi situs yang tidak baik.

Kode dia menulis akan lebih baik sebagai:

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

Tapi saya sarankan ini sebagai gantinya:

func Exists(name string) (bool, error) {
  _, err := os.Stat(name)
  if os.IsNotExist(err) {
    return false, nil
  }
  return err != nil, err
}
Komentar (3)
    _, 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)
    }
Komentar (0)

Fungsi contoh:

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

Let's melihat beberapa aspek pertama, kedua fungsi yang disediakan oleh os paket golang tidak utilitas tapi kesalahan catur, apa yang saya maksud dengan itu adalah bahwa mereka hanya bungkus untuk menangani kesalahan pada lintas platform.

Jadi pada dasarnya, jika os.Stat jika fungsi ini doesn't memberikan kesalahan yang berarti file yang sudah ada jika tidak anda perlu memeriksa apa jenis kesalahan itu, di sini datang menggunakan dua fungsi os.IsNotExist dan os.IsExist.

Hal ini dapat dipahami sebagai Stat file melemparkan kesalahan karena itu doesn't ada atau melemparkan kesalahan karena itu eksis dan ada beberapa masalah dengan itu.

Parameter bahwa fungsi-fungsi ini anda ambil adalah dari jenis kesalahan, meskipun anda mungkin dapat lulus nihil untuk itu tapi itu tidak't make sense.

Ini juga menunjukkan fakta bahwa IsExist adalah tidak sama !IsNotExist, mereka adalah jalan dua hal yang berbeda.

Jadi sekarang jika anda ingin tahu jika suatu file yang ada pada pergi, aku akan lebih memilih cara terbaik adalah:

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

Apa jawaban yang lain tidak terjawab, bahwa jalan yang diberikan untuk fungsi yang benar-benar bisa menjadi sebuah direktori. Berikut fungsi membuat yakin, bahwa jalan itu benar-benar sebuah file.

`` func fileExists(string filename) bool { info, err := os.Stat(filename) jika os.IsNotExist(err) { kembali palsu } kembali !info.IsDir() }

``

Hal lain untuk menunjukkan: kode Ini masih bisa menyebabkan kondisi balapan, di mana thread lain atau proses menghapus atau menciptakan file yang ditentukan, sedangkan fileExists fungsi berjalan.

Jika anda're khawatir tentang hal ini, gunakan mengunci benang, membuat akses ke fungsi ini atau gunakan inter-proses semaphore jika beberapa aplikasi yang terlibat. Jika aplikasi lain yang terlibat, di luar kendali anda, anda're beruntung, saya kira.

Komentar (0)