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?

hardPass
sumber
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.

Mostafa
sumber
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
123

Anda bisa menggunakan ini:

if _, err := os.Stat("./conf/app.ini"); err != nil {
    if os.IsNotExist(err) {
        // file does not exist
    } else {
        // other error
    }
}

Lihat: http://golang.org/pkg/os/#IsNotExist

Denys Séguret
sumber
6
Ini lebih baik daripada jawaban yang diterima tetapi apakah klausa lain benar-benar diperlukan?
Sergey Koulikov
9
@SergeyKoulikov Mungkin ada kesalahan lain, seperti izin.
Denys Séguret
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 ().

Edward Wagner
sumber
-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
    }
}
Kabeer Shaikh
sumber
Ini adalah duplikat dari jawaban oleh Denys Séguret.
StardustGogeta