使用BOOST_FOREACH迭代目录中的所有文件

时间:2012-01-04 10:31:42

标签: c++ boost boost-filesystem boost-foreach

您可以使用boost :: filesystem和BOOST_FOREACH迭代目录中的所有文件吗? 我试过了

path dirPath = ...
int fileCount = 0;
BOOST_FOREACH(const path& filePath, dirPath)
    if(is_regular_file(filePath))
        ++fileCount;

此代码编译,运行,但不会产生所需的结果。

3 个答案:

答案 0 :(得分:30)

您可以使用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
    } 
}

答案 1 :(得分:1)

所以我猜想我错过了这个船,但即使我发现理论上应该有效的代码,我也遇到了类似的问题。问题是boost :: filesystem :: path数据类型从字符串中取出最后一个char。

我正在读取文件,我的路径是“c:\ one \ two \ three”。但是当我将它设为路径数据类型时,字符串被更改为“c:\ one \ two \ thre”。不知道那是什么,但由于这个原因,找不到文件位置,等等等等。我做了什么来解决它只是添加另一个'\'到最后。这样它就会删除'\'而不是'e'。

之后工作得很好。但如前所述,我不知道为什么会这样做。希望这有助于某人。

答案 2 :(得分: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适用于满足单通道范围概念的类型。例如,我们可以使用BOOST_FOREACH:

  • STL容器
  • 阵列
  • 以空字符结尾的字符串(char和wchar_t)
  • std ::对迭代器
  

请注意
  对STL容器的支持非常普遍;任何看起来像STL容器的东西都很重要。如果它嵌套了迭代器和const_iterator类型以及begin()和end()成员函数,BOOST_FOREACH将自动知道如何迭代它。就是这样,boost :: iterator_range&lt;&gt;和boost :: sub_range&lt;&gt;与BOOST_FOREACH合作。