मैं सी ++ में निर्देशिका में फ़ोल्डरों को सूचीबद्ध करना चाहता हूं, आदर्श रूप से एक पोर्टेबल (प्रमुख ऑपरेटिंग सिस्टम में काम करना) में। मैंने POSIX का उपयोग करने का प्रयास किया, और यह सही तरीके से काम करता है, लेकिन मैं कैसे पहचान सकता हूं कि पाया गया आइटम एक फ़ोल्डर है या नहीं?निर्देशिका में केवल फ़ोल्डरों को सूचीबद्ध करना
उत्तर
सी ++ 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;
}
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
}
ठीक है, लेकिन यह विंडोज पर काम करता है? – m4tx
हां: http://msdn.microsoft.com/en-us/library/14h5k7ff.aspx –
मुझे PhysFS का उल्लेख करने के लिए मजबूर होना लगता है। मैंने इसे अपने स्वयं के प्रोजेक्ट में एकीकृत किया है। यह सच्चे क्रॉस-प्लेटफ़ॉर्म (मैक/लिनक्स/पीसी) फ़ाइल संचालन प्रदान करता है और ज़िप, 7zip, pak, आदि जैसे विभिन्न संग्रह परिभाषाओं को भी अनपैक कर सकता है। इसमें कुछ फ़ंक्शन हैं (PHYSFS_isDirectory, PHYSFS_enumerateFiles) जो यह निर्धारित कर सकते हैं कि आप क्या मांग रहे हैं।
यहाँ आप को दिखाने के लिए एक (थोड़ा संशोधित) 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
}
}
}
}
आप स्ट्रिंग के रूप में निर्देशिका नाम कैसे प्राप्त करते हैं? – ar2015
आप 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;
}
विंडोज के अंतर्गत, आप _findfirst उपयोग कर सकते हैं() और _findnext() निर्देशिका की सामग्री के माध्यम से पुनरावृति, और फिर CreateFile() और GetFileInformationByHandle उपयोग करने के लिए() यह निर्धारित करने के लिए कि कोई विशेष प्रविष्टि निर्देशिका या फ़ोल्डर है या नहीं। (हाँ, CreateFile(), उचित तर्क के साथ, किसी मौजूदा फ़ाइल को जांच करने के लिए। जीवन भव्य नहीं है?)
संदर्भ के लिए, कुछ वर्गों जहाँ मैं कोड लागू किया उन कॉल का उपयोग करता है here और here
देखा जा सकता है
मेरा मानना है कि चूंकि यह अधिक पोर्टेबल तरीका है और अभी भी किसी बाहरी पुस्तकालय का उपयोग नहीं करता है, इसलिए अब यह एक स्वीकार्य उत्तर होने के लिए अधिक योग्य है। – m4tx