आप सी में निर्देशिका सूची कैसे प्राप्त करते हैं?

आप सी में फ़ोल्डर और फ़ाइलों के लिए निर्देशिका कैसे स्कैन करते हैं? इसे क्रॉस-प्लेटफॉर्म होना चाहिए।

0
ro fr bn

9 उत्तर

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

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

0
जोड़ा
@ceretullis: शब्द "मानक" नोट करें .. बूस्ट अभी तक मानक नहीं है ..
जोड़ा लेखक krebstar, स्रोत
बूस्ट भी सी नहीं है
जोड़ा लेखक Chris Lutz, स्रोत
बूस्ट :: फाइल सिस्टम ??
जोड़ा लेखक paxos1977, स्रोत

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

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

सी-एफएक्यू उत्तर यहां दिया गया है:

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

0
जोड़ा
क्या _findfirst, _findnext और _findclose कहीं के लिए पहले से ही एक उपनाम सेटअप है? windows.h में नहीं है?
जोड़ा लेखक BuddyJoe, स्रोत

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

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

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

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

0
जोड़ा

readdir के लिए सबसे समान विधि शायद कम ज्ञात _find फ़ंक्शंस का परिवार

0
जोड़ा

GLib is a portability/utility library for C which forms the basis of the GTK+ graphical toolkit. It can be used as a standalone library.

इसमें निर्देशिकाओं के प्रबंधन के लिए पोर्टेबल रैपर शामिल हैं। विवरण के लिए ग्लिब फ़ाइल उपयोगिताओं दस्तावेज़ देखें।

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

जैक्स, मैं लगभग एक बिक्री लड़के की तरह लग रहा हूं :) (चिंता न करें, ग्लिब ओपन सोर्स (एलजीपीएल) है और मैं किसी भी तरह से इसके साथ संबद्ध नहीं हूं)

0
जोड़ा
+1; प्रासंगिक कार्य g_dir_read_name() है
जोड़ा लेखक weiqure, स्रोत

मैंने एक ओपन सोर्स (बीएसडी) सी हेडर बनाया है जो इस समस्या से संबंधित है। यह वर्तमान में 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, स्रोत
tinydir.h के लिए 'वोट अप', ठीक है।
जोड़ा लेखक M.J.Ahmadi, स्रोत

opendir/readdir are POSIX. If POSIX is not enough for the portability you want to achieve, check Apache Portable Runtime

0
जोड़ा

निम्नलिखित निर्देशिका में फ़ाइलों के नाम मुद्रित करेंगे:

#include 
#include 
#include 

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/ सॉफ्टवेयर/libtool/मैनुअल/libc/सरल-निर्देशिका-Lister.html )

0
जोड़ा
इसके बारे में क्या: त्रुटि: अज्ञात प्रकार का नाम 'off64_t'
जोड़ा लेखक Tomáš Zato, स्रोत
विंडोज के लिए, आपको dirent.h के Win32 कार्यान्वयन की आवश्यकता हो सकती है: github.com/tronkko/dirent । बस को "dirent.h" में बदलें
जोड़ा लेखक bot1131357, स्रोत
@ क्लेटन लेकिन मुझे सिखाया गया है कि कभी भी() का उपयोग नहीं करता क्योंकि यह नहीं जानता कि कितने अक्षर प्रिंट करना चाहते हैं?
जोड़ा लेखक YakRangi, स्रोत
मुझे जबकि स्थिति (ep = readdir (dp)) में बदलना पड़ा था! = NULL)
जोड़ा लेखक gwg, स्रोत
यह कम से कम MinGW के साथ, विंडोज़ पर भी काम करना चाहिए।
जोड़ा लेखक el.pescado, स्रोत
@Rouftantical मुझे लगता है कि आप हो जाता है के बारे में है और नहीं रखता है। हो जाता है खतरनाक है क्योंकि यह बफर ओवरफ़्लो का कारण बन सकता है जबकि puts नहीं कर सकता है।
जोड़ा लेखक molnarg, स्रोत
@ क्लेटन - अगर मैं सिर्फ .txt फ़ाइलों को मुद्रित करना चाहता हूं तो क्या होगा?
जोड़ा लेखक jimo, स्रोत

You can find the sample code on the wikibooks link

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

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;
}
0
जोड़ा