使用Boost遍历目录失败

时间:2012-03-15 11:47:13

标签: c++ boost

我在使用以下功能时遇到了一些麻烦。它应该被赋予一个路径和一组允许的文件扩展名,然后使用任何这些扩展名查找该路径中的所有文件。相反,它什么都没找到并返回一个空集。

std::set<boostfs::path> scan_directory(const boostfs::path& p,
                                       const bool recurse,
                                       const std::set<std::string>& allowed) {
    std::string ext ;
    std::set<boostfs::path> incs, incs2 ;
    boostfs::path::iterator itr ;

    // Extract directory and filename
    boostfs::path file = p.filename() ;
    boostfs::path dir = p.parent_path() ;

    std::cout << "path: " << p.string() << std::endl ;

    for (itr = dir.begin(); itr != dir.end(); ++itr) {
        if (boostfs::is_directory(*itr)) {
            if (recurse) {
                std::cout << "dir: " << itr->string() << std::endl ;
                incs2 = scan_directory(*itr, true, allowed) ;
                incs.insert(incs2.begin(), incs2.end()) ;
            }
        } else {
            // Don't include the original source
            if (*itr != p) {
                // Include only allowed file types
                ext = itr->extension().string() ;
                std::cout << "file: " << itr->string() << std::endl ;
                std::cout << "ext: " << ext << std::endl ;
                if (allowed.find(ext) != allowed.end()) {
                    incs.insert(*itr) ;
                }
            }
        }
    }

    return incs ;
}

cout的打印仅用于调试。我正在使用以下目录结构对其进行测试:

./test/cpp/
    foo.cpp
    foo.h
    test.cpp
./test/cpp/bar/
    baz.cpp
    baz.h

我使用路径“test / cpp / test.cpp”调用该函数,recurse为true,并且包含一个字符串“.cpp”的集合。我从打印件中获得以下输出,

path: test/cpp/test.cpp
dir: test
path: test
file: cpp
ext:

然后函数结束,程序的其余部分继续,只有它被赋予一组空的文件,所以没有多少工作。给定测试目录,它应该返回一个包含“test / cpp / foo.cpp”和“test / cpp / bar / baz.cpp”的集合。

我很确定它不久前就可以使用,但我不确定它什么时候坏了或我做了什么让它这样做了。我确信这是一个小的,恼人的技术性。

1 个答案:

答案 0 :(得分:1)

我发现了我的问题。我使用path::iterator而不是directory_iterator(或recursive_directory_iterator),因此我循环遍历路径的组件而不是目录的内容。我本可以早点发誓,但也许这可能是运气。

这是我的工作代码

std::set<boostfs::path> scan_directory(const boostfs::path& p,
                                       const bool recurse,
                                       const std::set<std::string>& allowed) {
    std::string ext ;
    std::set<boostfs::path> incs ;

    // Extract directory and filename
    boostfs::path file = p.filename() ;
    boostfs::path dir = p.parent_path() ;

    boostfs::recursive_directory_iterator itr(dir), itr_end ;

    while(itr != itr_end) {
        if (boostfs::is_directory(*itr)) {
            itr.no_push(!recurse) ;
        } else {
            // Don't include the original source
            if (*itr != p) {
                // Include only allowed file types
                ext = itr->path().extension().string() ;
                if (allowed.find(ext) != allowed.end()) {
                    incs.insert(*itr) ;
                }
            }
        }

        itr++ ;
    }

    return incs ;
}

我会让人知道在Boost的文档中迭代目录的例子是AWFUL