v3で日本語対応も行われたことですし、そろそろFilesystemも使い始めようかと思います。
今回書いたのは、ディレクトリ内のファイル列挙です。日本語使ってないですが。
C:\fooフォルダの中身
a.txt b.jpg c.cpp
コード
#define BOOST_FILESYSTEM_VERSION 3 #include <iostream> #include <boost/filesystem/operations.hpp> #include <boost/foreach.hpp> namespace fs = boost::filesystem; int main() { const fs::path path = "C:\\foo"; BOOST_FOREACH (const fs::path& p, std::make_pair(fs::directory_iterator(path), fs::directory_iterator())) { std::cout << p.filename() << std::endl; } }
a.txt b.jpg c.cpp
directory_iteratorにはRange版がないようだったので、イテレータの組をRangeとして扱いました。
Boost.Rangeのfor_eachも試してみましたが、こちらはConceptCheckの段階で、directory_iteratorがSinglePassIteratorConceptを満たさない、というコンパイルエラーになってしまいました。
(Boost.ForeachにはConceptCheckがない)
directory_iteratorかIterator Conceptのどちらかが間違っているのだと思いますが、まだ追いきれてません。
#define BOOST_FILESYSTEM_VERSION 3 #define BOOST_RANGE_ENABLE_CONCEPT_ASSERT 0 #include <iostream> #include <boost/filesystem/operations.hpp> #include <boost/range/algorithm/for_each.hpp> namespace fs = boost::filesystem; int main() { const fs::path path = "C:\\foo"; boost::for_each(std::make_pair(fs::directory_iterator(path), fs::directory_iterator()), [](const fs::path& p) { std::cout << p.filename() << std::endl; } ); }