C++ 在Boost文件系统中过滤文件夹

C++ 在Boost文件系统中过滤文件夹,c++,boost,window,boost-filesystem,C++,Boost,Window,Boost Filesystem,我想用Windows中的Boost文件系统将所有文件放在一个具体的文件夹中(本例中为文档) 为此,我做了一个过滤器,以确保我没有文件夹 问题是,当我仍然获得以下文件夹时: "C:\....\Documents\My Videos", "C:\....\Documents\My Music", "C:\....\Documents\My Pictures" (我没有其他文件夹) 代码如下: boost::filesystem::directory_iterator end; for (boos

我想用Windows中的Boost文件系统将所有文件放在一个具体的文件夹中(本例中为文档)

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

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

"C:\....\Documents\My Videos", 
"C:\....\Documents\My Music",
"C:\....\Documents\My 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";
    }
boost::filesystem::directory\u迭代器end;
for(boost::filesystem::directory\u迭代器iter(documentsFolder);iter!=end;++iter){
如果(!is_目录(*iter)){

std::cout path()这些可能是连接点

我只是在一个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";
            }
        }
    }
}
请注意,
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";
}
intmain(intargc,char*argv[])
{
使用名称空间boost::适配器;
std::向量常量args(argv+1,argv+argc);
用于(自动和定向:参数)
for(自动输入:遍历目录(dir)|已筛选(是否为有效文件))

std::cout这些东西不是符号链接吗?它们可能是指向用户名/图片或其他任何东西的链接。您还可以打印出类型和路径,以查看boost文件系统实际认为它是什么。我将尝试获取boost文件系统认为它是的文件类型,是的……无论如何,我为避免这些文件夹所做的就是尝试捕获询问文件大小,因为这些文件夹没有大小属性看起来很酷,会尽快查看。非常感谢:)当然,语法糖假设您有c++11支持(例如,我在MSVC12==VS2013上测试过)
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);
}