C++ 使用BOOST\u FOREACH迭代目录中的所有文件

C++ 使用BOOST\u FOREACH迭代目录中的所有文件,c++,boost,boost-filesystem,boost-foreach,C++,Boost,Boost Filesystem,Boost Foreach,可以使用boost::filesystem和boost\u FOREACH对目录中的所有文件进行迭代吗? 我试过了 此代码可编译、运行,但不会产生所需的结果。您的dirPath要么不是序列,要么序列大小为1 BOOST_FOREACH迭代序列。但究竟什么才是序列呢?由于BOOST_FOREACH构建在BOOST.Range之上,因此它自动支持BOOST.Range识别为序列的类型。具体来说,BOOST_FOREACH使用满足单通道范围概念的类型。例如,我们可以将BOOST_FOREACH用于:

可以使用boost::filesystem和boost\u FOREACH对目录中的所有文件进行迭代吗? 我试过了


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

您的
dirPath
要么不是序列,要么序列大小为1

BOOST_FOREACH迭代序列。但究竟什么才是序列呢?由于BOOST_FOREACH构建在BOOST.Range之上,因此它自动支持BOOST.Range识别为序列的类型。具体来说,BOOST_FOREACH使用满足单通道范围概念的类型。例如,我们可以将BOOST_FOREACH用于:

  • STL容器
  • 阵列
  • 以Null结尾的字符串(char和wchar\t)
  • 一对迭代器

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


您可以使用
BOOST\u 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
    } 
}
#包括
#包括
名称空间fs=boost::filesystem;
fs::path targetDir(“/tmp”);
目录迭代器it(targetDir),eod;
BOOST_FOREACH(fs::path const&p,std::make_pair(it,eod))
{ 
if(fs::is_regular_file(p))
{
//用p做点什么
} 
}

所以我猜我错过了这次机会,但即使在我找到了理论上可以工作的代码之后,我也遇到了类似的问题。问题在于boost::filesystem::path数据类型会去掉字符串的最后一个字符

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


在那之后一切都很好。但如前所述,我不知道它为什么这样做。希望这对别人有帮助

任何关于如何修复代码的建议(仍然使用BOOST_FOREACH)?您需要传递FOREACH可以迭代的内容,例如文件数组。否则不要使用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
    } 
}