Saya telah membaca jawaban untuk Apa cara terbaik untuk memeriksa apakah file ada di C? (lintas platform) , tetapi saya bertanya-tanya apakah ada cara yang lebih baik untuk melakukan ini menggunakan c ++ libs standar? Lebih disukai tanpa mencoba membuka file sama sekali.
Keduanya stat
dan access
cukup tidak dapat di Google. Apa yang harus saya #include
gunakan untuk menggunakan ini?
Jawaban:
Gunakan boost :: filesystem :
sumber
Berhati-hatilah dengan kondisi balapan: jika file menghilang antara pemeriksaan "ada" dan saat Anda membukanya, program Anda akan gagal secara tidak terduga.
Lebih baik pergi dan buka file, periksa kegagalan dan jika semuanya baik maka lakukan sesuatu dengan file tersebut. Ini bahkan lebih penting dengan kode keamanan kritis.
Detail tentang keamanan dan kondisi ras: http://www.ibm.com/developerworks/library/l-sprace.html
sumber
Saya adalah pengguna yang senang meningkatkan dan pasti akan menggunakan solusi Andreas. Tetapi jika Anda tidak memiliki akses ke boost libs, Anda dapat menggunakan perpustakaan aliran:
Ini tidak sebagus boost :: filesystem :: existing karena file sebenarnya akan dibuka ... tapi biasanya itu adalah hal berikutnya yang ingin Anda lakukan.
sumber
Gunakan stat (), jika cukup lintas platform untuk kebutuhan Anda. Ini bukan standar C ++, tapi POSIX.
Di MS Windows ada _stat, _stat64, _stati64, _wstat, _wstat64, _wstati64.
sumber
Bagaimana dengan
access
?sumber
Kemungkinan lain terdiri dari penggunaan
good()
fungsi di aliran:sumber
Saya akan mempertimbangkan kembali mencoba mencari tahu apakah ada file. Sebaliknya, Anda harus mencoba membukanya (dalam Standar C atau C ++) dalam mode yang sama dengan yang Anda inginkan. Apa gunanya mengetahui bahwa file tersebut ada jika, katakanlah, tidak dapat ditulis saat Anda perlu menggunakannya?
sumber
ls
program yang -seperti? Saya menduga poster asli di sini tidak ingin membuka file sama sekali. Fungsi stat Posix seharusnya memberi Anda informasi tentang izin file, jadi itu akan memperbaiki masalah itu.Jika kompiler Anda mendukung C ++ 17, Anda tidak perlu boost, Anda cukup menggunakan
std::filesystem::exists
sumber
TIDAK doronganDIBUTUHKAN , yang akan menjadi pembunuhan besar - besaran .
Gunakan stat () (bukan cross platform meskipun seperti yang disebutkan oleh pavon), seperti ini:
Keluaran:
Versi lain (dan itu) dapat ditemukan di sini .
sumber
Jika Anda sudah menggunakan kelas aliran file input (
ifstream
), Anda dapat menggunakan fungsinyafail()
.Contoh:
sumber