2011-06-17 21 views
13

पर सी का उपयोग कर निर्देशिका खाली है या नहीं, क्या यह जांचने का सही तरीका है कि कोई निर्देशिका खाली है या नहीं? क्या खाली निर्देशिका की जांच करने के लिए एक और अधिक प्रभावी तरीका है, खासकर अगर खाली होने पर फाइलों के 1000s हैं?जांचें कि क्या लिनक्स

int isDirectoryEmpty(char *dirname) { 
    int n = 0; 
    struct dirent *d; 
    DIR *dir = opendir(dirname); 
    if (dir == NULL) //Not a directory or doesn't exist 
    return 1; 
    while ((d = readdir(dir)) != NULL) { 
    if(++n > 2) 
     break; 
    } 
    closedir(dir); 
    if (n <= 2) //Directory Empty 
    return 1; 
    else 
    return 0; 
} 

तो इसकी एक खाली निर्देशिका, readdir प्रविष्टियों के बाद बंद हो जाएगा '।' और '..' और इसलिए n<=2 खाली है।

तो अपने खाली या मौजूद नहीं है, यह 1 लौटना चाहिए, और वापसी 0

अद्यतन:

@c$ time ./isDirEmpty /fs/dir_with_1_file; time ./isDirEmpty /fs/dir_with_lots_of_files 
0 

real 0m0.007s 
user 0m0.000s 
sys 0m0.004s 

0 

real 0m0.016s 
user 0m0.000s 
sys 0m0.008s 

क्यों यह अब फ़ाइलों के बहुत सारे के साथ एक निर्देशिका के लिए जाँच करने के लिए ले करता है के रूप में की तुलना में सिर्फ एक फ़ाइल के साथ?

उत्तर

8

वहाँ एक खाली निर्देशिका के लिए जाँच करने के लिए एक अधिक कुशल तरीका है, विशेष रूप से अगर यह फ़ाइलों अगर खाली नहीं

तरह से आप अपने कोड लिखा था यह कितने कोई फर्क नहीं पड़ता की 1000s है फाइलें हैं (आप break अगर एन> 2)। तो आपका कोड अधिकतम 5 कॉल का उपयोग कर रहा है। मुझे नहीं लगता कि (पोर्टेबल) इसे तेज बनाने का कोई तरीका है।

+0

कृपया मेरे संपादन को पढ़ें, एक ही कोड के लिए एक ही निर्देशिका के लिए एक फ़ाइल पर चलाने के लिए अधिक समय क्यों लगता है, जिसमें एक फ़ाइल की तुलना में बहुत सारी फाइलें हैं? – freethinker

+0

@freethinker मुझे यकीन नहीं है। एक 'स्ट्रेस' करें और हमें दिखाएं। – cnicutar

+0

ने स्ट्रैस – freethinker

3
bool has_child(string path) 
{ 
    if(!boost::filesystem::is_directory(path)) 
     return false; 

    boost::filesystem::directory_iterator end_it; 
    boost::filesystem::directory_iterator it(path); 
    if(it == end_it) 
     return false; 
    else 
     return true; 
} 
+1

@ फ्रैथिंकर सी। बूल में कोडिंग कर रहा है जब तक कि आप उन्हें कुछ परिभाषित न करें: 'typedef enum {false, true} bool;'। – Larrimus

0

हो सकता है कि इस कोड को तुम्हारी मदद कर सकता:

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) { 
    char cmd[1024]; 
    char *folder = "/tmp"; 
    int status, exitcode; 

    if(argc == 2) 
      folder = argv[1]; 

    snprintf(cmd, 1024, "test $(ls -A \"%s\" 2>/dev/null | wc -l) -ne 0", folder); 
    printf("executing: %s\n", cmd); 

    status = system(cmd); 
    exitcode = WEXITSTATUS(status); 

    printf ("exit code: %d, exit status: %d\n", exitcode, status); 

    if (exitcode == 1) 
      printf("the folder is empty\n"); 
    else 
      printf("the folder is non empty\n"); 


    return 0; 
} 

यदि फ़ोल्डर ls -एक फ़ोल्डर 2>/dev/बातिल का उपयोग कर खाली है मैं जाँच | wc -l, फ़ोल्डर में फ़ाइलों को गिनने के लिए, यदि यह शून्य लौटाता है तो फ़ोल्डर खाली होता है और फ़ोल्डर खाली नहीं होता है। WEXITSTATUS मैक्रो, निष्पादित कमांड का निकास कोड देता है।

नोट: यदि फ़ोल्डर मौजूद नहीं है, या आपके पास इसे एक्सेस करने के लिए सही अनुमति नहीं है, तो इस प्रोग्राम को "फ़ोल्डर खाली है" प्रिंट करना होगा।

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