「指定ディレクトリ配下の全ファイルにたいして"なんかする"関数作ってくんない?」
「んー...いいよ。Windows? Linux?」
「できればどっちも」
「どっちも?!」
...ってなわけで作ってみた。 Windows/Linuxに対応しろって。
両者のファイルシステムAPIはかなり異なってて、
コード2本書くのがめんどかったので boost::filesystem 使ったなり。
#include <algorithm>
#include <boost/filesystem.hpp>
template<typename Function>
void for_each_path(const boost::filesystem::path& p, Function fn) {
using namespace boost::filesystem;
// pがフツーのファイルやったらファンクタを適用
if ( is_regular_file(p) ) {
fn(p);
}
// ディレクトリやったら一段降りて再帰呼び出し
else if ( is_directory(p) ) {
std::for_each(directory_iterator(p), directory_iterator(),
[&](const directory_entry& ent) { for_each_path(ent.path(),fn); });
}
}
/*
* おためし
*/
#include <iostream>
int main() {
using namespace boost::filesystem;
// カレント・ディレクトリにある全ファイルのパスをプリント
for_each_path(path("."),
[](const path& p) { std::cout << p.string() << std::endl;});
}
...いいじゃない。FindFirstFile/FindNextFileよりわかりやすいし簡単だわ♪