【问题标题】:Iterate over all files in a directory using BOOST_FOREACH使用 BOOST_FOREACH 遍历目录中的所有文件
【发布时间】:2012-02-02 06:19:56
【问题描述】:

你能否使用 boost::filesystem 和 BOOST_FOREACH 遍历目录中的所有文件? 我试过了

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        您的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 容器
        • 数组
        • 以 Null 结尾的字符串(char 和 wchar_t)
        • std::迭代器对

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

        【讨论】:

        • 有什么建议可以修复代码(仍在使用 BOOST_FOREACH)?
        • 您需要传递一些 FOREACH 可以迭代的内容,例如文件数组。否则不要使用 FOREACH。
        猜你喜欢
        • 2015-03-05
        • 1970-01-01
        • 2018-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多