Bagaimana cara memeriksa apakah ada file atau direktori?


131

Saya ingin memeriksa keberadaan file ./conf/app.inidalam kode Go saya, tetapi saya tidak dapat menemukan cara yang baik untuk melakukannya.

Saya tahu ada metode File di Java public boolean exists():, yang mengembalikan true jika file atau direktori ada.

Tetapi bagaimana ini bisa dilakukan di Go?


7
Juga perhatikan bahwa tergantung pada bagaimana Anda akan menggunakan informasi ini, Anda memiliki kondisi balapan. Yang bisa Anda katakan adalah bahwa beberapa saat yang lalu file itu / tidak-ada; pada saat Anda bertindak pada tes yang sebaliknya mungkin benar. Biasanya lebih baik untuk memeriksa saat melakukan operasi apa pun yang ingin Anda lakukan (mis. Jangan memeriksa sebelum membuka file yang ada atau membuat file baru tetapi lakukan f, err := os.Open(name)atau f, err := os.OpenFile(name,os.O_CREATE|os.O_EXCL, mode)dan kemudian periksa os.IsNotExist(err)).
Dave C

Jawaban:


189
// exists returns whether the given file or directory exists
func exists(path string) (bool, error) {
    _, err := os.Stat(path)
    if err == nil { return true, nil }
    if os.IsNotExist(err) { return false, nil }
    return false, err
}

Diedit untuk menambahkan penanganan kesalahan.


4
Sepertinya 'pemrograman pengecualian' bagi saya. Apakah ada sumber daya yang membenarkan kode semacam ini sebagai paradigma #golang resmi?
Olivier Amblet

21
@OlivierAmblet Tidak ada pengecualian yang terjadi di sini. Gunakan Go panicuntuk objek seperti "pengecualian" yang sebenarnya. Anda dapat "menangkap" dengan panggilan ke recover. Secara eksplisit mengembalikan errnilai pengembalian kedua adalah teknik Go idiomatik yang sangat umum. Lihat: golang.org/doc/effective_go.html#errors
Chris Pfohl

13
solusinya tidak terlalu sulit, pergi adalah khusus
zhaozhi

1
Memang benar bahwa tidak ada fungsi boolean Exists, tetapi kode aplikasi dapat lebih sederhana jika Anda hanya ingin memeriksa keberadaan file:if _, err := os.Stat("./conf/app.ini"); err == nil { /*exists*/ } else { /*not exists or some other error*/ }
Tobia

11
Mengapa segala sesuatu dalam bahasa ini begitu rumit?
Top Cat


22

Lebih dari FYI, karena saya melihat sekeliling selama beberapa menit berpikir pertanyaan saya adalah pencarian cepat.

Bagaimana cara memeriksa apakah path mewakili direktori yang ada di Go?

Ini adalah jawaban paling populer di hasil pencarian saya, tetapi di sini dan di tempat lain solusinya hanya menyediakan pemeriksaan keberadaan. Untuk memeriksa apakah pathmewakili direktori yang ada, saya menemukan saya dapat dengan mudah:

path := GetSomePath();
if stat, err := os.Stat(path); err == nil && stat.IsDir() {
    // path is a directory
}

Bagian dari masalah saya adalah bahwa saya mengharapkan path/filepathpaket berisi fungsi isDir ().



-2

Ada cara sederhana untuk memeriksa apakah file Anda ada atau tidak:

if _, err := os.Stat("./conf/app.ini"); err != nil {
    if os.IsNotExist(err) {
        ..... //Shows error if file not exists
    } else {
       ..... // Shows success message like file is there
    }
}

Ini adalah duplikat dari jawaban oleh Denys Séguret.
StardustGogeta
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.