您可以使用boost :: filesystem和BOOST_FOREACH迭代目录中的所有文件吗? 我试过了
path dirPath = ...
int fileCount = 0;
BOOST_FOREACH(const path& filePath, dirPath)
if(is_regular_file(filePath))
++fileCount;
此代码编译,运行,但不会产生所需的结果。
答案 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容器的支持非常普遍;任何看起来像STL容器的东西都很重要。如果它嵌套了迭代器和const_iterator类型以及begin()和end()成员函数,BOOST_FOREACH将自动知道如何迭代它。就是这样,boost :: iterator_range&lt;&gt;和boost :: sub_range&lt;&gt;与BOOST_FOREACH合作。