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>?将目录项
强制转换为标准::字符串
似乎不起作用:(。