2011-02-18 3 views
19

मैं सी ++ में निर्देशिका में फ़ोल्डरों को सूचीबद्ध करना चाहता हूं, आदर्श रूप से एक पोर्टेबल (प्रमुख ऑपरेटिंग सिस्टम में काम करना) में। मैंने POSIX का उपयोग करने का प्रयास किया, और यह सही तरीके से काम करता है, लेकिन मैं कैसे पहचान सकता हूं कि पाया गया आइटम एक फ़ोल्डर है या नहीं?निर्देशिका में केवल फ़ोल्डरों को सूचीबद्ध करना

उत्तर

5

सी ++ 17 std::filesystem पुस्तकालय का उपयोग करना:

std::vector<std::string> get_directories(const std::string& s) 
{ 
    std::vector<std::string> r; 
    for(auto& p : std::filesystem::recursive_directory_iterator(s)) 
     if(p.status().type() == std::filesystem::file_type::directory) 
      r.push_back(p.path().string()); 
    return r; 
} 
+0

मेरा मानना ​​है कि चूंकि यह अधिक पोर्टेबल तरीका है और अभी भी किसी बाहरी पुस्तकालय का उपयोग नहीं करता है, इसलिए अब यह एक स्वीकार्य उत्तर होने के लिए अधिक योग्य है। – m4tx

4

stat फ़ंक्शन देखें। Here एक विवरण है। कुछ नमूना कोड:

struct stat st; 
const char *dirname = "dir_name"; 
if(stat(dirname, &st) == 0 && S_ISDIR(st.st_mode)) { 
    // "dir_name" is a subdirectory of the current directory 
} else { 
    // "dir_name" doesn't exist or isn't a directory 
} 
+0

ठीक है, लेकिन यह विंडोज पर काम करता है? – m4tx

+0

हां: http://msdn.microsoft.com/en-us/library/14h5k7ff.aspx –

2

मुझे PhysFS का उल्लेख करने के लिए मजबूर होना लगता है। मैंने इसे अपने स्वयं के प्रोजेक्ट में एकीकृत किया है। यह सच्चे क्रॉस-प्लेटफ़ॉर्म (मैक/लिनक्स/पीसी) फ़ाइल संचालन प्रदान करता है और ज़िप, 7zip, pak, आदि जैसे विभिन्न संग्रह परिभाषाओं को भी अनपैक कर सकता है। इसमें कुछ फ़ंक्शन हैं (PHYSFS_isDirectory, PHYSFS_enumerateFiles) जो यह निर्धारित कर सकते हैं कि आप क्या मांग रहे हैं।

10

यहाँ आप को दिखाने के लिए एक (थोड़ा संशोधित) boost filesystem documentation से उद्धरण इस प्रकार यह कैसे किया जा सकता है:

void iterate_over_directories(const path & dir_path)   // in this directory, 
{ 
    if (exists(dir_path)) 
    { 
    directory_iterator end_itr; // default construction yields past-the-end 
    for (directory_iterator itr(dir_path); 
      itr != end_itr; 
      ++itr) 
    { 
     if (is_directory(itr->status())) 
     { 
     //... here you have a directory 
     } 
    } 
    } 
} 
+0

आप स्ट्रिंग के रूप में निर्देशिका नाम कैसे प्राप्त करते हैं? – ar2015

25

आप opendir() और readdir() इस्तेमाल कर सकते हैं निर्देशिका और उपनिर्देशिका सूची। निम्न उदाहरण वर्तमान पथ के अंदर सभी सबडायरेक्टरियों प्रिंट:

#include <dirent.h> 
#include <stdio.h> 

int main() 
{ 
    const char* PATH = "."; 

    DIR *dir = opendir(PATH); 

    struct dirent *entry = readdir(dir); 

    while (entry != NULL) 
    { 
     if (entry->d_type == DT_DIR) 
      printf("%s\n", entry->d_name); 

     entry = readdir(dir); 
    } 

    closedir(dir); 

    return 0; 
} 
+0

आप इन कार्यों का उपयोग कर केवल फ़ोल्डरों का चयन कर सकते हैं। मैंने आपको दिखाने के लिए एक उदाहरण जोड़ा है। –

+0

ठीक है, धन्यवाद। यह काम करता हैं। :) – m4tx

+0

[त्रुटि] 'स्ट्रक्चर सैंडेंट' का कोई सदस्य 'd_type' नाम नहीं है। मुझे यह त्रुटि क्यों मिलती है? – Faridzs

1

विंडोज के अंतर्गत, आप _findfirst उपयोग कर सकते हैं() और _findnext() निर्देशिका की सामग्री के माध्यम से पुनरावृति, और फिर CreateFile() और GetFileInformationByHandle उपयोग करने के लिए() यह निर्धारित करने के लिए कि कोई विशेष प्रविष्टि निर्देशिका या फ़ोल्डर है या नहीं। (हाँ, CreateFile(), उचित तर्क के साथ, किसी मौजूदा फ़ाइल को जांच करने के लिए। जीवन भव्य नहीं है?)

संदर्भ के लिए, कुछ वर्गों जहाँ मैं कोड लागू किया उन कॉल का उपयोग करता है here और here

देखा जा सकता है