Pustaka standar Go tidak memiliki fungsi yang hanya dimaksudkan untuk memeriksa apakah ada file atau tidak (seperti Python os.path.exists
). Apa cara idiomatis untuk melakukannya?
file
go
standard-library
Sridhar Ratnakumar
sumber
sumber
Jawaban:
Untuk memeriksa apakah file tidak ada, sama dengan Python
if not os.path.exists(filename)
:Untuk memeriksa apakah ada file, setara dengan Python
if os.path.exists(filename)
:Diedit: per komentar terbaru
sumber
NOTEXIST
, misalnya, jika/etc/bashrc
ada,/etc/bashrc/foobar
akan kembaliENOTDIR
!os.IsNotExist(err)
. Mungkin saja file ada tetapios.Stat
gagal karena alasan lain (mis. Izin, kegagalan disk). Menggunakanerr == nil
sebagai kondisi salah mengkategorikan kegagalan seperti "file tidak ada".Jawaban oleh Caleb Spare diposting di milis gonuts .
Diambil dari: https://groups.google.com/forum/#!msg/golang-nuts/Ayx-BMNdMFo/4rL8FFHr8v4J
sumber
Anda harus menggunakan
os.Stat()
danos.IsNotExist()
fungsinya seperti pada contoh berikut:Contohnya diambil dari sini .
sumber
The misalnya dengan user11617 tidak benar; itu akan melaporkan bahwa file itu ada bahkan dalam kasus di mana tidak, tetapi ada kesalahan dari beberapa jenis lainnya.
Tanda tangan harus ada (string) (bool, error). Dan kemudian, seperti yang terjadi, situs panggilan tidak lebih baik.
Kode yang ditulisnya akan lebih baik sebagai:
Tapi saya menyarankan ini sebagai gantinya:
sumber
err != nil
bukanerr == nil
? Jika ada kesalahan, maka file tersebut mungkin tidak ada?Apa jawaban lain yang terlewatkan, adalah bahwa jalur yang diberikan ke fungsi sebenarnya bisa berupa direktori. Fungsi berikut memastikan, bahwa path benar-benar file.
Hal lain yang perlu diperhatikan: Kode ini masih bisa mengarah pada kondisi balapan, di mana utas atau proses lain menghapus atau membuat file yang ditentukan, sementara fungsi fileExists sedang berjalan.
Jika Anda khawatir tentang ini, gunakan kunci di utas Anda, buat serialkan akses ke fungsi ini atau gunakan semafor antar-proses jika beberapa aplikasi terlibat. Jika aplikasi lain terlibat, di luar kendali Anda, Anda kurang beruntung, saya kira.
sumber
sumber
Contoh fungsi:
sumber
Mari kita lihat beberapa aspek terlebih dahulu, kedua fungsi yang disediakan oleh
os
paketgolang
bukan utilitas tetapi pemeriksa kesalahan, yang saya maksud dengan itu adalah mereka hanya pembungkus untuk menangani kesalahan pada lintas platform.Jadi pada dasarnya jika
os.Stat
jika fungsi ini tidak memberikan kesalahan yang berarti file itu ada jika Anda perlu memeriksa jenis kesalahan itu, inilah penggunaan kedua fungsi inios.IsNotExist
danos.IsExist
.Ini dapat dipahami sebagai
Stat
kesalahan melempar file karena tidak ada atau melempar kesalahan karena ada dan ada beberapa masalah dengan itu.Parameter yang digunakan fungsi-fungsi ini adalah tipe
error
, meskipun Anda mungkin bisa meneruskannyanil
tetapi tidak masuk akal.Ini juga menunjukkan fakta bahwa
IsExist is not same as !IsNotExist
, mereka dua cara yang berbeda.Jadi sekarang jika Anda ingin tahu apakah file yang diberikan ada di mana saja, saya lebih suka cara terbaik adalah:
sumber
Seperti disebutkan dalam jawaban lain, adalah mungkin untuk membangun perilaku / kesalahan yang diperlukan dari menggunakan flag yang berbeda dengan
os.OpenFile
. Faktanya,os.Create
hanya singkatan yang masuk akal-default untuk melakukannya:Anda harus menggabungkan bendera ini sendiri untuk mendapatkan perilaku yang Anda minati:
Tergantung pada apa yang Anda pilih, Anda akan mendapatkan kesalahan yang berbeda.
Berikut adalah contoh di mana saya ingin membuka file untuk ditulis, tetapi saya hanya akan memotong file yang sudah ada jika pengguna mengatakan tidak apa-apa:
sumber
Cara terbaik untuk memeriksa apakah file ada:
sumber