読者です 読者をやめる 読者になる 読者になる

Boost.Filesystem使い始め

C++

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_iteratorIterator 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;
        }
    );
}