2012-12-19 10 views
7

संभव डुप्लिकेट:
What’s the best way to check if a file exists in C? (cross platform)सी, जांचें कि फ़ाइल पढ़ने/लिखने में सक्षम होने के बिना मौजूद है या नहीं?

मैं एक फ़ाइल मौजूद है या नहीं, इसकी जांच करना चाहते हैं। मैंने अपने testfile की अनुमतियों को "chmod -r somefile" में बदल दिया। हालांकि अब यह कहता है कि फ़ाइल मौजूद नहीं है, भले ही यह अस्तित्व में है।

तो मुझे लगता है कि अगर मुझे पढ़ने की अनुमति नहीं है तो मैं "fopen r" के साथ फ़ाइल नहीं खोल सकता। लेकिन इसका मतलब यह होगा कि कोई फ़ाइल मौजूद है या नहीं पढ़ा जा सकता है या नहीं लिखा जा सकता है?

या क्या मुझे कुछ याद आ रहा है? कोई भी मदद बहुत अच्छी रहेगी।

धन्यवाद!

int doesFileExist(const char* filename) 
{ 
    FILE* fptr = fopen(filename, "r"); 
    if (fptr != NULL) 
    { 
    fclose(fptr); 
    printf("File exists\n"); 
    return 1; 
    } 
    printf("File doesnt exist\n"); 
    return 0; 
} 

अद्यतन: इन महान लिंक और स्पष्टीकरण के लिए धन्यवाद दोस्तों!

+1

उम .. क्या आपने 'errno' की जांच की है? संपादित करें: कुछ त्रुटि संदेश प्राप्त करने के लिए इसे आज़माएं: 'printf (" फ़ाइल मौजूद नहीं है:% s \ n ", strerror (errno)); 'errno.h' हेडर शामिल करना न भूलें। – Jack

+0

यह वही है जो मुझे stdio API के बारे में नफरत है, जब भी आपको किसी फ़ाइल को आकार बदलने की तरह कुछ नॉनट्रिविअल करने की आवश्यकता होती है, या इसे कॉपी करने और पुराने को हटाने के बिना फ़ाइल को स्थानांतरित करने की आवश्यकता होती है, तो आप पोर्टेबिलिटी के मामले में भाग्य से बाहर हैं। – Thomas

उत्तर

18

fopen असल में फ़ाइल खोलने का प्रयास करता है, जो आप नहीं कर सकते हैं यदि आपके पास पढ़ने की पहुंच नहीं है। यह जांचने के लिए कि फ़ाइल इसे खोलने के बिना मौजूद है या नहीं, stat का उपयोग करें; stat आपको फ़ाइल के बारे में मेटाडेटा देता है, और केवल फ़ाइल वाली निर्देशिका तक पहुंच पढ़ने की आवश्यकता होती है, न कि फ़ाइल स्वयं।

int doesFileExist(const char *filename) { 
    struct stat st; 
    int result = stat(filename, &st); 
    return result == 0; 
} 

आप की जाँच errno अगर result 0 नहीं है द्वारा अधिक सजावटी मिल सकता है; यदि errnoENOENT है तो फ़ाइल मौजूद नहीं है, यदि यह ENOTDIR है तो आपके द्वारा प्रदान किए गए पथ का हिस्सा निर्देशिका नहीं है, यदि यह EACCESS है तो आपके पास पथ में निर्देशिकाओं में से किसी एक पर पढ़ने की अनुमति नहीं थी और इसलिए stat कर सकते हैं आपको जवाब नहीं देता, और इसी तरह।

इसके अलावा, ध्यान रखें कि यदि आप सिम्लिंक (किसी भी यूनिक्स-जैसे, या विंडोज विस्टा या बाद में) वाले प्लेटफ़ॉर्म पर हैं, तो आपको यह पता होना चाहिए कि क्या आप सिम्लिंक या फ़ाइल को इंगित करते हैं या नहीं । यदि आप stat पर कॉल करते हैं, तो आप उस फ़ाइल के बारे में पूछ रहे हैं जो इसे इंगित करता है; यदि आपके पास एक सिम्लिंक dir/link है जो other/file पर इंगित करता है, तो statother/file (जो आमतौर पर आप चाहते हैं, के परिणाम लौटाएंगे, क्योंकि अगर आप फ़ाइल खोलते हैं तो आप यही प्राप्त करेंगे)।हालांकि, अगर आप लिंक के बारे में उत्सुक हैं (यदि आप जानना चाहते हैं "dir/link मौजूद है, भले ही other/file नहीं है?"), तो आपको lstat() का उपयोग करना चाहिए। एक संगतता आवरण (वे तुम्हें _stat() का उपयोग पसंद करते हैं, और यदि आप ऐसा नहीं करते चेतावनी देगा), लेकिन यह आम तौर पर देशी मंच एपीआई उपयोग करना बेहतर है के रूप में विंडोज पर

stat() काम करता है। विंडोज़ पर, आपको शायद GetFileAttributes():

int doesFileExist(const char *filename) { 
    return GetFileAttributes(filename) != INVALID_FILE_ATTRIBUTES; 
} 
-1

लिनक्स (और कई अन्य सिस्टम) पर, आप opendir() और मित्रों को सूचीबद्ध करने के लिए दोस्तों का उपयोग कर सकते हैं। मुझे लगता है कि केवल पढ़ने के लिए फाइलें दिखाई देंगे। अन्य प्लेटफॉर्म पर समान कार्य उपलब्ध होना चाहिए।

1

आप वास्तव में जांच नहीं कर रहे हैं कि फ़ाइल यहां मौजूद है या नहीं ... आप जांच रहे हैं कि क्या आप इसे पढ़ने के उपयोग के साथ खोल सकते हैं। फ़ाइल मौजूद नहीं होने के अलावा अन्य कारणों से यह असफल हो सकता है। जैसा कि आपने देखा है, हो सकता है कि आपके पास पढ़ने की अनुमति न हो। यह भी हो सकता है कि फ़ाइल लॉक है।

चेक इस उत्तर:

What's the best way to check if a file exists in C? (cross platform)

यह stat, जो सिवाय अगर आप निर्देशिका जिसमें फ़ाइल रहता है पर पढ़ने की नहीं है ज्यादातर मामलों में काम करना चाहिए का उपयोग कर पता चलता है।

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