正在筛选Boost文件系统中的文件夹

Filtering folders in Boost Filesystem

本文关键字:文件夹 文件系统 Boost 筛选      更新时间:2023-10-16

我想在Windows中使用Boost Filesystem获取具体文件夹(在本例中为Documents)中的所有文件。

为此,我做了一个过滤器,以确保我没有文件夹。

问题是,当我仍然得到以下文件夹:

"C:....DocumentsMy Videos", 
"C:....DocumentsMy Music",
"C:....DocumentsMy Pictures"

(我没有其他文件夹)

代码如下:

boost::filesystem::directory_iterator end;
for (boost::filesystem::directory_iterator iter(documentsFolder); iter != end; ++iter){
    if (!is_directory(*iter)){
        std::cout << iter->path() << "n";
    }
    else{
        std::cout << "-------->>>" << iter->path() << "n";
    }

有没有什么方法可以在不进行手动筛选的情况下避免这些文件夹?

非常感谢!

这些可能是交叉点。

我只是在一个windows盒子上尝试了一下,使用junction.exe(来自sysinternals)来创建一个连接点,并使用这个小测试程序来定位它们:

#include <boost/range/iterator_range.hpp>
#include <boost/filesystem.hpp>
#include <vector>
#include <string>
#include <iostream>
int main(int argc, char* argv[])
{
    using namespace boost::filesystem;
    std::vector<std::string> args(argv+1, argv+argc);
    if (args.empty()) args.push_back("C:\WORK");
    for (auto dir : args)
    {
        recursive_directory_iterator f(dir), l;
        for (directory_entry& entry : boost::make_iterator_range(f,l))
        {
            if (is_other(entry))
            {
                assert(!is_regular_file(entry));
                assert(!is_directory(entry));
                std::cout << entry << "n";
            }
        }
    }
}

现在用test.exe "C:WORK"打印的运行

"C:WORKMyJunction"

注意,assers证明了既不是常规文件也不是目录


在稍微不相关的新闻中,这对于目录迭代来说是相当不错的:

int main(int argc, char* argv[])
{
    using namespace boost::adaptors;
    std::vector<std::string> const args(argv+1, argv+argc);
    for (auto& dir : args)
        for (auto& entry : traverse_directory(dir) | filtered(is_valid_file))
            std::cout << entry << "n";
}

使用这些相当简单的助手:

template <typename T>
boost::iterator_range<boost::filesystem::recursive_directory_iterator> traverse_directory(T const& dir) {
    boost::filesystem::recursive_directory_iterator f(dir), l;
    return boost::make_iterator_range(f, l);
}
static bool is_valid_file(boost::filesystem::directory_entry const& entry) {
    return is_regular_file(entry) && !is_other(entry);
}

看到它在Coliru上直播