boost directory_iterator示例 - 如何列出不递归的目录文件

jav*_*red 32 boost boost-filesystem

我应该如何使用directory_iterator列出目录文件(不是递归)?

我应该添加/链接什么头文件/库或我应该做的其他设置?我在我的项目中使用了boost,但directory_iterator出于某种原因是"声称不足的标识符",而我可以使用其他的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';
}
Run Code Online (Sandbox Code Playgroud)

seh*_*ehe 56

该tut3例子是,你在找什么:

在科利鲁看到它

这是基于c ++ 11的简化版本:

Live On Coliru

#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";
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以看到我链接了boost_system(用于错误代码工具)和boost_filesystem:

g++ -std=c++11 -Os -Wall -pedantic main.cpp -lboost_system -lboost_filesystem && ./a.out .
"." is a directory containing:
"./main.cpp"
"./a.out"
Run Code Online (Sandbox Code Playgroud)

  • @Stefan如果您诋毁标准库算法,这是很好的逻辑.另外,我只是指教程(按照链接),本着古老的精神[教男人如何钓鱼](http://en.wiktionary.org/wiki/give_a_man_a_fish_and_you_feed_him_for_a_day;_teach_a_man_to_fish_and_you_feed_him_for_a_lifetime).最后,答案很有用,并已被OP接受.我很好.(IOW _你的评论并不关注优点,而是关注你自己与主流c ++习语的明显混淆.你可以自由地提供一个简单的答案:)_) (5认同)
  • 感谢您介绍`make_iterator_range(foo,{})`,它很有用. (4认同)
  • 这是一个特别糟糕的例子,因为它没有关注 directory_iterator 并进一步使用了很多流魔术或 std::copy。 (2认同)

Sha*_* Zi 8

经过测试的解决方

#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;
        }    
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这比现有的答案更加经过考验,差不多2年前发布了,甚至有现场演示? (3认同)