Pada dasarnya, saya ingin memeriksa apakah saya memiliki hak untuk membuka file tersebut sebelum saya benar-benar mencoba membukanya; Saya tidak ingin menggunakan coba / tangkap untuk pemeriksaan ini kecuali jika harus. Apakah ada properti akses file yang dapat saya periksa sebelumnya?
c#
.net
file-access
Horas
sumber
sumber
Jawaban:
Saya telah melakukan ini berkali-kali di masa lalu, dan hampir setiap kali saya melakukannya, saya bahkan salah melakukannya.
Izin file (bahkan keberadaan file) tidak stabil - mereka dapat berubah kapan saja. Berkat Hukum Murphy, ini khususnya mencakup periode singkat antara saat Anda memeriksa file dan saat Anda mencoba membukanya. Perubahan bahkan lebih mungkin terjadi jika Anda berada di area yang Anda tahu perlu diperiksa terlebih dahulu. Namun anehnya hal itu tidak akan pernah terjadi di lingkungan pengujian atau pengembangan Anda, yang cenderung cukup statis. Hal ini membuat masalah sulit untuk dilacak nanti dan memudahkan bug semacam ini untuk membuatnya menjadi produksi.
Artinya, Anda masih harus dapat menangani pengecualian jika izin atau keberadaan file buruk, meskipun Anda telah memeriksa. Kode penanganan pengecualian diperlukan , baik Anda memeriksa izin file terlebih dahulu atau tidak. Kode penanganan pengecualian menyediakan semua fungsionalitas pemeriksaan keberadaan atau izin. Selain itu, meskipun penangan pengecualian seperti ini diketahui lambat, penting untuk diingat bahwa i / o disk bahkan lebih lambat ... jauh lebih lambat ... dan memanggil fungsi .Exists () atau memeriksa izin akan memaksa perjalanan tambahan keluar dari sistem file.
Singkatnya, pemeriksaan awal sebelum mencoba membuka file adalah mubazir dan boros. Tidak ada keuntungan tambahan atas penanganan pengecualian, ini sebenarnya akan merugikan, bukan membantu, kinerja Anda, ini menambah biaya dalam hal lebih banyak kode yang harus dipertahankan, dan ini dapat menyebabkan bug halus ke dalam kode Anda. Tidak ada keuntungan sama sekali untuk melakukan pemeriksaan awal. Sebaliknya, hal yang benar di sini adalah mencoba membuka file dan berusaha menjadi penangan pengecualian yang baik jika gagal. Hal yang sama juga berlaku meskipun Anda hanya memeriksa apakah file tersebut ada atau tidak. Alasan ini berlaku untuk setiap sumber daya yang mudah menguap.
sumber
Tip cepat untuk siapa pun yang datang ke sini dengan masalah serupa:
Hati-hati dengan aplikasi sinkronisasi web seperti DropBox. Saya hanya menghabiskan 2 jam memikirkan pernyataan "menggunakan" (pola Buang) rusak di NET.
Saya akhirnya menyadari bahwa Dropbox terus membaca dan menulis file di latar belakang, untuk menyinkronkannya.
Tebak di mana folder Visual Studio Projects saya berada? Di dalam folder "Dropbox Saya" tentunya.
Oleh karena itu, saat saya menjalankan aplikasi saya dalam mode Debug, file yang dibaca dan ditulisnya juga terus diakses oleh DropBox untuk disinkronkan dengan server DropBox. Ini menyebabkan konflik penguncian / akses.
Jadi setidaknya sekarang saya tahu bahwa saya membutuhkan fungsi Buka File yang lebih kuat (yaitu TryOpen () yang akan melakukan banyak percobaan). Saya terkejut itu belum menjadi bagian bawaan dari kerangka kerja.
[Memperbarui]
Inilah fungsi pembantu saya:
sumber
using
harus digunakan oleh penelepon meskipun ...using
tidak akan berfungsi di sini. Pada akhir blok penggunaan,fs
akan ditutup paksa. Anda akan memberikan penelepon sebuah filestream TUTUP (sangat tidak berguna)!Inilah solusi yang Anda cari
ini membuat izin baru untuk membaca berdasarkan tampilan untuk jalur semua file lalu memeriksa apakah itu sama dengan akses file baca.
sumber
Pertama, apa yang dikatakan Joel Coehoorn.
Juga: Anda harus memeriksa asumsi yang mendasari keinginan Anda untuk menghindari penggunaan coba / tangkap kecuali Anda harus melakukannya. Alasan umum untuk menghindari logika yang bergantung pada pengecualian (membuat
Exception
objek berkinerja buruk) mungkin tidak relevan dengan kode yang membuka file.Saya kira jika Anda menulis metode yang mengisi
List<FileStream>
dengan membuka setiap file dalam subpohon direktori dan Anda mengharapkan sejumlah besar dari mereka tidak dapat diakses, Anda mungkin ingin memeriksa izin file sebelum mencoba membuka file sehingga Anda tidak melakukannya. mendapatkan terlalu banyak pengecualian. Tapi Anda masih akan menangani pengecualian. Juga, mungkin ada sesuatu yang salah dengan desain program Anda jika Anda menulis metode yang melakukan ini.sumber
sumber
sumber
attempts
disahkan oleh ref? Itu tidak masuk akal. Begitu pula dengan pengujian,<=
bukan hanya==
.throw ex
ini sebenarnya hal yang benar untuk dilakukan.