2008-08-15 26 views

उत्तर

5

opendir/readdir POSIX हैं। यदि POSIX पोर्टेबिलिटी हासिल करना चाहते हैं के लिए पर्याप्त नहीं है, जाँच Apache Portable Runtime

68

निम्नलिखित मौजूदा निर्देशिका में फ़ाइलों के नाम प्रिंट होगा:

#include <stdio.h> 
#include <sys/types.h> 
#include <dirent.h> 

int main (void) 
{ 
    DIR *dp; 
    struct dirent *ep;  
    dp = opendir ("./"); 

    if (dp != NULL) 
    { 
    while (ep = readdir (dp)) 
     puts (ep->d_name); 

    (void) closedir (dp); 
    } 
    else 
    perror ("Couldn't open the directory"); 

    return 0; 
} 

(क्रेडिट: http://www.gnu.org/software/libtool/manual/libc/Simple-Directory-Lister.html)

+1

पर नमूना कोड मिल सकता है यह कम से कम MinGW के साथ, साथ ही विंडोज पर काम करना चाहिए। –

+1

@ क्लेटन लेकिन मुझे सिखाया गया है कि कभी भी() का उपयोग नहीं करते क्योंकि यह नहीं जानता कि कितने अक्षर प्रिंट करना चाहते हैं? – YakRangi

+0

इसके बारे में क्या: 'त्रुटि: अज्ञात प्रकार का नाम' off64_t'' –

18

सख्त जवाब "आप नहीं कर सकते", क्योंकि फ़ोल्डर की अवधारणा वास्तव में क्रॉस-प्लेटफॉर्म नहीं है।

एमएस प्लेटफ़ॉर्म पर आप _findfirst, _findnext और _findclose का उपयोग 'सी' प्रकार के अनुभव के लिए कर सकते हैं, और अंतर्निहित Win32 कॉल के लिए FindFirstFile और FindNextFile का उपयोग कर सकते हैं।

http://c-faq.com/osdep/readdir.html

+0

क्या कोई उपनाम पहले से ही _findfirst, _findnext और _findclose के लिए सेटअप है? windows.h में नहीं है? – BuddyJoe

9

कोई मानक C (या सी ++) जिस तरह से एक निर्देशिका में फ़ाइलों की गणना करने में है:

यहाँ सी पूछे जाने वाले प्रश्न जवाब है।

विंडोज के तहत आप निर्देशिका में सभी प्रविष्टियों को गिनने के लिए FindFirstFile/FindNextFile फ़ंक्शंस का उपयोग कर सकते हैं। लिनक्स/ओएसएक्स के तहत opendir/readdir/बंदरगाह कार्यों का उपयोग करें।

+0

बूस्ट :: फाइल सिस्टम ?? – paxos1977

+1

@ceretullis: शब्द "मानक" पर ध्यान दें .. बूस्ट अभी तक मानक नहीं है .. – krebstar

+23

बूस्ट भी सी –

2

निर्देशिका सूची ओएस/मंच के अनुसार विचार में काफी भिन्न होती है। ऐसा इसलिए है क्योंकि, अपने स्वयं के आंतरिक सिस्टम का उपयोग कर विभिन्न ऑपरेटिंग सिस्टम इसे प्राप्त करने के लिए कहते हैं।

इस समस्या का समाधान एक पुस्तकालय की तलाश करना होगा जो इस समस्या और पोर्टेबल को मुखौटा करता है। दुर्भाग्य से, कोई समाधान नहीं है जो सभी प्लेटफॉर्म पर बेकार ढंग से काम करता है।

पॉज़िक्स संगत सिस्टम पर, आप क्लेटन द्वारा पोस्ट किए गए कोड का उपयोग करके इसे प्राप्त करने के लिए लाइब्रेरी का उपयोग कर सकते हैं (जिसे मूल रूप से डब्ल्यू रिचर्ड स्टीवंस द्वारा यूनिक्स पुस्तक के तहत उन्नत प्रोग्रामिंग से संदर्भित किया गया है)। यह समाधान * NIX सिस्टम के तहत काम करेगा और यदि आपके पास सिगविन स्थापित है तो विंडोज़ पर भी काम करेगा।

वैकल्पिक रूप से, आप अंतर्निहित ओएस का पता लगाने के लिए एक कोड लिख सकते हैं और फिर उचित निर्देशिका सूची फ़ंक्शन को कॉल कर सकते हैं जो उस ओएस के तहत निर्देशिका संरचना को सूचीबद्ध करने का 'उचित' तरीका रखेगा।

7

GLib सी के लिए एक पोर्टेबिलिटी/उपयोगिता लाइब्रेरी है जो जीटीके + ग्राफिकल टूलकिट का आधार बनाती है। इसे एक स्टैंडअलोन लाइब्रेरी के रूप में इस्तेमाल किया जा सकता है।

इसमें निर्देशिकाओं के प्रबंधन के लिए पोर्टेबल रैपर शामिल हैं। विवरण के लिए Glib File Utilities दस्तावेज देखें।

व्यक्तिगत रूप से, मैं अपने पीछे जीएलआईबी की तरह कुछ सी-कोड लिखने पर भी विचार नहीं करता। पोर्टेबिलिटी एक बात है, लेकिन डेटा संरचनाओं, थ्रेड हेल्पर्स, इवेंट्स, मेनलॉप्स इत्यादि को

जैक्स, मैं लगभग बिक्री लड़के की तरह लग रहा हूं :) (चिंता न करें, ग्लिब खुला स्रोत (LGPL) और मैं किसी भी तरह से यह साथ संबद्ध नहीं हूँ)

+2

+1 नहीं है; प्रासंगिक कार्य 'g_dir_read_name()' – weiqure

13

मैंने एक ओपन सोर्स (बीएसडी) सी हेडर बनाया है जो इस समस्या से संबंधित है। यह वर्तमान में POSIX और विंडोज का समर्थन करता है। कृपया उसे जांचें बाहर:

https://github.com/cxong/tinydir

tinydir_dir dir; 
tinydir_open(&dir, "/path/to/dir"); 

while (dir.has_next) 
{ 
    tinydir_file file; 
    tinydir_readfile(&dir, &file); 

    printf("%s", file.name); 
    if (file.is_dir) 
    { 
     printf("/"); 
    } 
    printf("\n"); 

    tinydir_next(&dir); 
} 

tinydir_close(&dir); 
+0

यह मूल सिस्टम निर्भर कार्यान्वयन से कहीं अधिक कैसे मदद करता है? या ऐसा है कि आपको केवल विंडोज और पॉज़िक्स के लिए नामित लाइब्रेरी की आवश्यकता है? – kevr

+0

tinydir.h के लिए 'वोट अप', ठीक है। –

-1

आप wikibooks link

/************************************************************** 
* A simpler and shorter implementation of ls(1) 
* ls(1) is very similar to the DIR command on DOS and Windows. 
**************************************************************/ 
#include <stdio.h> 
#include <dirent.h> 

int listdir(const char *path) 
{ 
    struct dirent *entry; 
    DIR *dp; 

    dp = opendir(path); 
    if (dp == NULL) 
    { 
    perror("opendir"); 
    return -1; 
    } 

    while((entry = readdir(dp))) 
    puts(entry->d_name); 

    closedir(dp); 
    return 0; 
} 

int main(int argc, char **argv) { 
    int counter = 1; 

    if (argc == 1) 
    listdir("."); 

    while (++counter <= argc) { 
    printf("\nListing %s...\n", argv[counter-1]); 
    listdir(argv[counter-1]); 
    } 

    return 0; 
}