18

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

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

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

4

3 回答 3

32

您可以使用以下方式迭代目录中的文件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
    } 
}
于 2012-01-04T10:57:03.947 回答
1

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

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

在那之后工作得很好。但如前所述,我不知道它为什么这样做。希望这可以帮助某人。

于 2017-07-06T22:42:52.740 回答
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::pair 迭代器

注意
对 STL 容器的支持非常普遍;任何看起来像 STL 容器的东西都很重要。如果它具有嵌套的 iterator 和 const_iterator 类型以及 begin() 和 end() 成员函数,BOOST_FOREACH 将自动知道如何对其进行迭代。正是通过这种方式 boost::iterator_range<> 和 boost::sub_range<> 与 BOOST_FOREACH 一起工作。

于 2012-01-04T10:36:39.297 回答