2012-02-16 24 views
20

मैं एक निर्देशिका मौजूद है या नहीं, यह जांचने के लिए opendir फ़ंक्शन का उपयोग कर रहा हूं। समस्या यह है कि मैं इसे बड़े पैमाने पर लूप पर उपयोग कर रहा हूं और यह मेरे ऐप द्वारा उपयोग किए जाने वाले रैम को बढ़ा रहा है।सी यह जांचने के लिए तेज़ तरीका है कि कोई निर्देशिका मौजूद है या नहीं

सी में निर्देशिका मौजूद है या नहीं, यह जांचने का सबसे अच्छा (सबसे तेज़ तरीका) क्या है? यदि अस्तित्व में नहीं है तो इसे बनाने के लिए सबसे अच्छा (सबसे तेज़) तरीका क्या है?

+7

बेवकूफ सवाल, क्या आप 'बंदर()' को बाद में बुला रहे हैं? – user7116

+0

और यह तेज़ तरीका असीमित रूप से ऐसा करने के लिए हो सकता है, लेकिन आपको अपने मीडिया की क्षमताओं पर विचार करना चाहिए। यदि यह नियमित एचडीडी है तो यह तलाश-तूफान में असफल हो सकता है और यह धीमा काम करेगा। लेकिन यदि आप RAID/SSD का उपयोग करते हैं या क्लाउड में भी काम करते हैं, तो यह काम करेगा। – LiMar

उत्तर

16

आप mkdir() पर कॉल कर सकते हैं। यदि निर्देशिका मौजूद नहीं है तो यह बनाया जाएगा और 0 वापस कर दिया जाएगा। यदि निर्देशिका मौजूद है तो -1 वापस कर दिया जाएगा और errno को EEXIST पर सेट किया जाएगा।

+2

चेतावनी के साथ कि पथ के साथ कुछ भी मौजूद नहीं है, तो 'ENOENT' हो सकता है। – user7116

+0

सच है। उसमें उल्लेख किया जाना चाहिए था। – ckruse

+2

क्या यह स्टेट से तेज़ है? –

2

यदि उपलब्ध हो तो मैं stat() का उपयोग करूंगा।

39

stat का उपयोग करने पर विचार करें। S_ISDIR(s.st_mode) आपको बताएगा कि यह एक निर्देशिका है या नहीं।

नमूना:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 

... 
struct stat s; 
int err = stat("/path/to/possible_dir", &s); 
if(-1 == err) { 
    if(ENOENT == errno) { 
     /* does not exist */ 
    } else { 
     perror("stat"); 
     exit(1); 
    } 
} else { 
    if(S_ISDIR(s.st_mode)) { 
     /* it's a dir */ 
    } else { 
     /* exists but is no dir */ 
    } 
} 
... 
+1

यह opendir की तुलना में कितनी तेजी से तुलना कर रहा है? –

+3

यह ऑपरेटिंग सिस्टम और मूल निर्देशिका में मौजूद प्रविष्टियों की संख्या पर निर्भर करता है। यह किसी भी तरह से तेज़ होगा और यही 'स्टेट' के लिए बनाया गया है। –

+0

लिनक्स 64 बिट्स, 1 एंट्री –

0

ऐसा लगता है कि आप एक स्मृति रिसाव है। कॉलिंग ओपेन्डिर को आपके ऐप की रैम को तब तक नहीं बढ़ाया जाना चाहिए जब तक आप निर्देशिका को सफलतापूर्वक खोलने के बाद हमेशा बंदर को कॉल करना याद रखें। साथ ही, सुनिश्चित करें कि आप निर्देशिका नाम की गणना करने के लिए आवंटित किसी भी बफर को मुक्त कर रहे हैं।

+0

हाँप मैं इसे बंद कर रहा हूं, मैं बस स्टेट का उपयोग करूंगा, आपके समय के लिए धन्यवाद! –

16

मैं access()

if (0 != access("/path/to/possible_dir/", F_OK)) { 
    if (ENOENT == errno) { 
    // does not exist 
    } 
    if (ENOTDIR == errno) { 
    // not a directory 
    } 
} 

का उपयोग कर आप निर्देशिका नाम में एक अनुगामी / सुनिश्चित हैं पसंद करते हैं, इस पूरी तरह से काम करता है।

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

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