boost目录迭代器示例-如何列出非递归的目录文件

boost目录迭代器示例-如何列出非递归的目录文件,boost,boost-filesystem,Boost,Boost Filesystem,如何使用目录迭代器列出目录文件(非递归) 另外,我应该添加哪些头文件/lib/link或进行其他设置?我在项目中使用boost,但由于某种原因,目录迭代器是“未声明的标识符”,而我可以使用其他boost功能 更新 另一个解决方案: #include <filesystem> #include <boost/filesystem.hpp> #include <iostream> using namespace boost::filesystem; for (

如何使用
目录迭代器
列出目录文件(非递归)

另外,我应该添加哪些头文件/lib/link或进行其他设置?我在项目中使用boost,但由于某种原因,
目录迭代器
是“未声明的标识符”,而我可以使用其他boost功能

更新

另一个解决方案:

#include <filesystem>
#include <boost/filesystem.hpp>
#include <iostream>

using namespace boost::filesystem;

for (directory_iterator itr(path_ss); itr!=directory_iterator(); ++itr)
{
    cout << itr->path().filename() << ' '; // display filename only
    if (is_regular_file(itr->status())) cout << " [" << file_size(itr->path()) << ']';
    cout << '\n';
}
#include <boost/filesystem.hpp>
#include <iterator>
#include <iostream>
#include <vector>

using namespace boost::filesystem;

int main(int argc, char *argv[])
{
    path p(argc>1? argv[1] : ".");
    std::vector<directory_entry> v; // To save the file names in a vector.

    if(is_directory(p))
    {
        copy(directory_iterator(p), directory_iterator(), back_inserter(v));
        std::cout << p << " is a directory containing:\n";

        for ( std::vector<directory_entry>::const_iterator it = v.begin(); it != v.end();  ++ it )
        {
            std::cout<< (*it).path().string()<<endl;
        }    
    }
}
#包括
#包括
#包括
使用名称空间boost::filesystem;
对于(目录迭代器itr(路径);itr!=目录迭代器();++itr)
{
cout path().filename()status())cout您要查找的是

查看它

#include <boost/filesystem.hpp>
#include <boost/range/iterator_range.hpp>
#include <iostream>

using namespace boost::filesystem;

int main(int argc, char *argv[]) {
    path p(argc>1? argv[1] : ".");

    if(is_directory(p)) {
        std::cout << p << " is a directory containing:\n";

        for(auto& entry : boost::make_iterator_range(directory_iterator(p), {}))
            std::cout << entry << "\n";
    }
}
以下是基于c++11的简化版本:

#include <boost/filesystem.hpp>
#include <boost/range/iterator_range.hpp>
#include <iostream>

using namespace boost::filesystem;

int main(int argc, char *argv[]) {
    path p(argc>1? argv[1] : ".");

    if(is_directory(p)) {
        std::cout << p << " is a directory containing:\n";

        for(auto& entry : boost::make_iterator_range(directory_iterator(p), {}))
            std::cout << entry << "\n";
    }
}
经过测试的解决方案:

#include <filesystem>
#include <boost/filesystem.hpp>
#include <iostream>

using namespace boost::filesystem;

for (directory_iterator itr(path_ss); itr!=directory_iterator(); ++itr)
{
    cout << itr->path().filename() << ' '; // display filename only
    if (is_regular_file(itr->status())) cout << " [" << file_size(itr->path()) << ']';
    cout << '\n';
}
#include <boost/filesystem.hpp>
#include <iterator>
#include <iostream>
#include <vector>

using namespace boost::filesystem;

int main(int argc, char *argv[])
{
    path p(argc>1? argv[1] : ".");
    std::vector<directory_entry> v; // To save the file names in a vector.

    if(is_directory(p))
    {
        copy(directory_iterator(p), directory_iterator(), back_inserter(v));
        std::cout << p << " is a directory containing:\n";

        for ( std::vector<directory_entry>::const_iterator it = v.begin(); it != v.end();  ++ it )
        {
            std::cout<< (*it).path().string()<<endl;
        }    
    }
}
#包括
#包括
#包括
#包括
使用名称空间boost::filesystem;
int main(int argc,char*argv[])
{
路径p(argc>1?argv[1]:“);
std::vector v;//将文件名保存在向量中。
if(is_目录(p))
{
复制(目录迭代器(p),目录迭代器(),返回插入器(v));

std::cout这是一个特别糟糕的例子,因为它没有关注目录迭代器,并且进一步使用了大量的流魔术或std::copy。@Stefan如果你不相信标准库算法,这是一个很好的逻辑。另外,我只是指教程(按照链接)最后,答案是有用的,已经被OP接受了。我很好。(你的评论不是关注于优点,而是停留在你自己与主流C++习语的明显混淆上。你可以提供一个简单的答案:)顺便说一句,在这个例子中有很多质量是值得怀疑的,讽刺的是,你没有提到任何一个。所以,我简化了我的答案代码(但不是tut3,但你可以为此创建一个pull请求:))谢谢你引入
make_iterator_range(foo,{})
,它很有用。新位置:这比两年前发布的、甚至有现场演示的现有答案在哪方面测试得更多?@sehe确实,我不会说这一个测试得更多。尽管它确实方便地将文件名保存在向量中,以便以后也可以调用文件名,我想。它始终严格地说是使用枚举是非常灵活的。您总是可以选择将枚举放入容器中。另一种方法是impossible@sehe顺便说一句,如果我想将文件名保存在
std::string
s的
vector
中,而不是
目录项的
vector
中,您可能知道我应该如何修改此代码吗de>?将
目录项
强制转换为
标准::字符串
似乎不起作用:(。