2009-09-05 25 views
61

मुझे एक fstream my_file ("test.txt") मिला है, लेकिन मुझे नहीं पता कि test.txt मौजूद है या नहीं। यदि यह अस्तित्व में है, तो मैं जानना चाहूंगा कि मैं इसे भी पढ़ सकता हूं या नहीं। उसको कैसे करे?यह जांचने के लिए कि कोई फ़ाइल मौजूद है या C++ में पठनीय है?

मैं लिनक्स का उपयोग करता हूं।

+0

कहां है "संभव डुप्लिकेट"। मुझे आश्चर्य है कि हमारे बच्चों के बच्चे इस सवाल से पूछेंगे? – SChepurin

उत्तर

80

मैं शायद के साथ जाना होगा:

ifstream my_file("test.txt"); 
if (my_file.good()) 
{ 
    // read away 
} 

good विधि जांच करता है कि धारा से पढ़ा जा करने के लिए तैयार है।

+12

इस तरह आप न केवल यह जांचते हैं कि यह मौजूद है या पठनीय है, आप वास्तव में इसे खोलते हैं। – xtofl

+1

हाँ, यह सच है। मैंने ओपी के सवाल को पढ़ा कि फ़ाइल पहले से ही खोली गई थी, लेकिन मैं गलत हो सकता था। –

10

ऑपरेटिंग सिस्टम/मंच क्या?

लिनक्स/यूनिक्स/MacOSX पर, आप fstat उपयोग कर सकते हैं।

विंडोज पर, आप GetFileAttributes का उपयोग कर सकते हैं।

आमतौर पर, मानक सी/सी ++ आईओ कार्यों के साथ ऐसा करने का कोई पोर्टेबल तरीका नहीं है।

+1

आप ऐसा क्यों कहते हैं, आप हमेशा फॉपेन के साथ एक फ़ाइल खोलने का प्रयास कर सकते हैं और यदि यह 0 लौटाता है तो आप पोर्टेबल को कम कर सकते हैं कि फ़ाइल nonexistent है। – Blindy

+1

fstat विंडोज़ पर भी 'sys/stat.h' में उपलब्ध है। – xtofl

8

यदि आप यूनिक्स पर हैं तो access() आपको बता सकता है अगर यह पठनीय है। हालांकि अगर एसीएल का उपयोग किया जा रहा है, तो यह अधिक जटिल हो जाता है, इस मामले में सिर्फ आईफस्ट्रीम के साथ फ़ाइल खोलना सर्वोत्तम है और पढ़ने की कोशिश करें .. यदि आप पढ़ नहीं सकते हैं तो एसीएल पढ़ने को रोक सकता है।

+1

एक्सेस() समय-समय पर उपयोग की जाने वाली बग को पेश करने का एक शानदार तरीका है। – bk1e

23

आप Boost.Filesystem का उपयोग हो सकता है। इसमें boost::filesystem::exist फ़ंक्शन है।

मुझे नहीं पता कि पढ़ने के अधिकारों को पढ़ने के बारे में कैसे पता नहीं है। आप Boost.Filesystem भी देख सकते हैं। हालांकि संभवतः फ़ाइल को पढ़ने की कोशिश करने के अलावा कोई अन्य (पोर्टेबल) तरीका नहीं होगा।

+0

क्या फाइल सिस्टम सिस्टम (> 256) पर बहुत लंबे पथ को संभालता है? हमने हाल ही में इस समस्या में भाग लिया कि गैर यूनिकोड विंडोज एपीआई में अधिकतम 256 वर्ण हैं। –

+0

मुझे नहीं पता। आप प्रलेखन में जांच सकते हैं (मेरे उत्तर में दिए लिंक पर) लेकिन मुझे यकीन नहीं है कि आपको यह और उसके लंबे समय मिलेगा। आप बूस्ट न्यूज़ ग्रुप से भी पूछ सकते हैं। एक और तरीका यह है कि इसे आसानी से जांचें। –

+0

@ रिचर्ड कॉर्डन मैंने फ़ंक्शन बूस्ट :: फाइल सिस्टम :: create_directories के साथ बहुत लंबे पथ की जांच की। एएनएसआई संस्करण (चार के लिए) लंबे मार्ग पर दिए गए अपवाद को फेंक दिया (लेकिन सीमा किसी भी तरह 250 के आसपास पहुंच गई थी, फिर MAX_PATH जो 260 के बराबर है)। यूनिकोड संस्करण (wchar_t के लिए) ने एएनएसआई संस्करण के रूप में अधिक फ़ोल्डरों को फेंक दिया और सफलतापूर्वक लौटाया, इसलिए न केवल यह काम नहीं किया बल्कि यह त्रुटि की रिपोर्ट भी नहीं की। मुझे नहीं पता कि यह अन्य कार्यों के साथ कैसा है लेकिन मुझे संदेह है कि वे अब भी बुरी तरह व्यवहार कर सकते हैं। –

0

विंडोज़ में fstat के उपयोग के बारे में, मुझे यकीन नहीं है कि यह वही है जो आप चाहते हैं। Microsoft से फ़ाइल पहले से ही खुली होनी चाहिए। Stat आपके लिए काम करना चाहिए।

2

मैं पोस्टर अंत में कहा कि वे लिनक्स का उपयोग कर रहे थे पता है, लेकिन मैं एक तरह से हैरान कोई भी उल्लेख किया है कि विंडोज के लिए PathFileExists() API कॉल कर रहा हूँ।

आपको Shlwapi.lib लाइब्रेरी, और Shlwapi.h हेडर फ़ाइल शामिल करने की आवश्यकता होगी।

#pragma comment(lib, "shlwapi.lib") 
#include <shlwapi.h> 

समारोह एक BOOL मान देता है और इतने की तरह कहा जा सकता है:

if(PathFileExists("C:\\path\\to\\your\\file.ext")) 
{ 
    // do something 
} 
+0

मैं दावों में भाग गया कि PathFileExists() अविश्वसनीय है: http://mfctips.com/tag/file-exists/ –

3

सी ++ 11 के बाद से यह संभव है अंतर्निहित operator boolgood() के बजाय का उपयोग करें:

ifstream my_file("test.txt"); 
if (my_file) { 
    // read away 
} 
संबंधित मुद्दे

 संबंधित मुद्दे