サンプルの動作確認バージョン [GCC4.4/1.41.0] [VC9/1.41.0]
#include <iostream>
#include <boost/filesystem/path.hpp>
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/fstream.hpp>
using namespace std;
int main()
{
namespace fs = boost::filesystem;
// ディレクトリ作成
fs::path dir( "my_dir" );
fs::create_directory( dir );
// ファイルを開いて書き込みー
// ディレクトリ名とファイル名の結合は / 演算子で
fs::ofstream f( dir/"test.txt" );
f << "Hello!" << endl;
f.close();
// カレントディレクトリのファイル一覧してみよう
fs::directory_iterator end;
for( fs::directory_iterator it(fs::current_path()); it!=end; ++it )
{
if( fs::is_directory(*it) )
cout << "D ";
else
cout << "F ";
// leaf() パス情報を切って、ファイルの名前部分のみ取り出し
cout << it->leaf() << endl;
}
return 0;
}
D jstl D kix D my_dir F test.cpp F test.d F test.exe F test.obj
C/C++では標準ライブラリには、「ファイルを削除する」とか 「ディレクトリを作成する」と言った関数が存在しません。 歴史的な経緯は全く知らないのですが、OS毎にディレクトリ区切りの記号が \ だったり : だったり / だったりとまちまちなことや、 そもそもディレクトリという概念が無い環境もあったりするせいでしょうか。 このためC++で、中身ではなくファイルそのものの操作をしようとすると、 CreateDirectoryとかmkdirとかDeleteFileとかunlink、などの OS 特有の機能を利用する必要があります。
しかしそれでは移植性のあるコードが書けなくて困ります。 そこで、それらをラップしたライブラリ( ACE の一部や sord などなど) が幾つか登場しました。boost::filesystem もその一つです。 今のところ、POSIXかWindows環境で動作するそうな。
version 1.34 で、 パス文字列として独自形式ではなく実行環境で普通に使われる形式を扱うようになりました。 できることは、パス名の、ディレクトリ名部分を取り出すとか、 フルパス←→相対パス変換などの操作や、 ファイルやディレクトリの削除、コピー、移動といった基本操作となっています。
また、directory_iteratorによるディレクトリの読み出しや、 基本的に std::fstream と同じな fs::fstream によるファイルの読み書きも、 ライブラリの一部として実装されています。