2012-01-04 6 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はSingle Pass Range Conceptを満たすタイプで動作します。例えば、我々は、とBOOST_FOREACHを使用することができる:

  • アレイ
  • ヌルで終了する文字列(文字とのwchar_t)イテレータの
  • のstd ::ペア

    • STLコンテナ


    STLコンテナのサポートは非​​常に一般的です。 STLコンテナのように見えるものはすべてカウントされます。 iteratorとconst_iteratorの型とbegin()とend()のメンバー関数をネストしている場合、BOOST_FOREACHはそれをどのように反復処理するかを自動的に認識します。これにより、boost :: iterator_range <>とboost :: sub_range <>がBOOST_FOREACHで動作します。

    +0

    どのように私は(BOOST_FOREACHを使用して)まだコードを修正する可能性がありますか? – user763305

    +0

    FOREACHは、たとえばファイルの配列のように繰り返し処理できるものを渡す必要があります。それ以外の場合はFOREACHを使用しないでください。 – clyfe

    1

    は、だから私は、私はこの1つ上のボートを逃した推測が、私は、コードことを発見した後も、同様の問題を抱えていました理論的にはうまくいくはずです。問題は、boost :: filesystem :: pathのデータ型は文字列の最後の文字を取ります。

    私はファイルから読んでいて、私のパスは "c:\ one \ two \ three"でした。しかし、私はそれをパスデータ型にしたとき、文字列は "c:\ one \ two \ thre"に変更されました。それが何であるかは分かりませんが、これによってファイルの場所が見つからずに、まばらに聞こえるようになりました。私が修正したのは、最後に別の '\'を追加することだけでした。そうすることで、 'e'の代わりに '\'が取り除かれます。

    は、それ以降はうまく機能しました。しかし、前に述べたように、私はなぜこれをしたのかわかりません。これが誰かを助けることを望みます。

    関連する問題