2012-01-04 5 views
17

का उपयोग कर निर्देशिका में सभी फ़ाइलों पर इटरेट करें क्या आप boost :: filesystem और BOOST_FOREACH का उपयोग कर निर्देशिका में सभी फ़ाइलों को पुन: सक्रिय कर सकते हैं? मैंने कोशिश कीBOOST_FOREACH

path dirPath = ... 
int fileCount = 0; 
BOOST_FOREACH(const path& filePath, dirPath) 
    if(is_regular_file(filePath)) 
     ++fileCount; 

इस कोड को संकलित करता है, चलाता है, लेकिन वांछित परिणाम का उत्पादन नहीं करता।

उत्तर

28

आप BOOST_FOREACH इस तरह का उपयोग कर एक निर्देशिका में फ़ाइलों पर पुनरावृति कर सकते हैं:

#include <boost/filesystem.hpp> 
#include <boost/foreach.hpp> 

namespace fs = boost::filesystem; 

fs::path targetDir("/tmp"); 

fs::directory_iterator it(targetDir), eod; 

BOOST_FOREACH(fs::path const &p, std::make_pair(it, eod)) 
{ 
    if(fs::is_regular_file(p)) 
    { 
     // do something with p 
    } 
} 
0

आपका dirPath या तो एक दृश्य नहीं है, या तो यह अनुक्रम आकार दृश्यों से अधिक 1.

http://www.boost.org/doc/libs/1_48_0/doc/html/foreach.html

BOOST_FOREACH दोहराता की है। लेकिन अनुक्रम के रूप में क्या योग्यता है, बिल्कुल? चूंकि BOOST_FOREACH Boost.Range के शीर्ष पर बनाया गया है, यह स्वचालित रूप से उन प्रकारों का समर्थन करता है जो Boost.Range अनुक्रम के रूप में पहचानता है। विशेष रूप से, BOOST_FOREACH एकल प्रकार रेंज अवधारणा को संतुष्ट करने वाले प्रकारों के साथ काम करता है। उदाहरण के लिए, हम साथ BOOST_FOREACH उपयोग कर सकते हैं:

  • एसटीएल कंटेनर
  • सरणियों
  • अशक्त-समाप्त तार (चार और wchar_t)
  • std :: iterators की जोड़ी

नोट
एसटीएल कंटेनर के लिए समर्थन बहुत सामान्य है; एसटीएल कंटेनर की तरह दिखने वाला कुछ भी। अगर उसने इटरेटर और const_iterator प्रकारों को नेस्टेड किया है और() और एंड() सदस्य फ़ंक्शन शुरू करते हैं, तो BOOST_FOREACH स्वचालित रूप से यह जान लेगा कि इसे कैसे पुन: सक्रिय किया जाए। यह इस तरह है कि boost :: iterator_range <> और boost :: sub_range <> BOOST_FOREACH के साथ काम करें।

+0

कोई सुझाव मैं कोड को कैसे ठीक कर सकता हूं (अभी भी BOOST_FOREACH का उपयोग कर रहा हूं)? – user763305

+0

उदाहरण के लिए फ़ाइलों की एक सरणी की तरह आपको कुछ फ़ॉरएच फिर से चालू करने की आवश्यकता है। अन्यथा फोरेच का उपयोग न करें। – clyfe

1

तो मैं अनुमान लगाया मैं इस पर नाव याद किया, लेकिन मैं एक ऐसी ही जारी होने के बाद भी मैं कोड पाया हो रही थी कि सैद्धांतिक रूप से काम करना चाहिए। मुद्दा बूस्ट :: फाइल सिस्टम :: पथ डेटा प्रकार स्ट्रिंग के अंतिम चार बंद लेता है।

मैं एक फ़ाइल से पढ़ रहा था और मेरा पथ "सी: \ एक \ दो \ तीन" था। लेकिन जब मैंने इसे पथ डेटा प्रकार बनाया, तो स्ट्रिंग को "c: \ one \ two \ thre" में बदल दिया गया। कोई विचार नहीं कि यह क्या है, लेकिन इसके कारण फ़ाइल स्थान नहीं मिला और ब्ला ब्ला ब्लाह। मैंने इसे ठीक करने के लिए क्या किया था बस अंत में एक और '\' जोड़ें। इस तरह यह 'ई' के बजाय '\' को हटा देता है।

उसके ठीक बाद ठीक काम किया। लेकिन जैसा कि पहले बताया गया है, मुझे नहीं पता कि यह क्यों हुआ। उम्मीद है कि यह किसी की मदद करता है।