使用Linux OpenSUSE 12.3 32位
我将在youtube上浏览Bartosz Milewski的c ++ 11并发视频。在第5部分中,他使用自己的filesystem.h文件,其中生成多个线程以读取目录及其子目录中的所有文件。所以我决定使用boost的文件系统方法,因为我无法访问他的。我无法弄清楚如何在directory_iterator上调用is_directory。
实际上我似乎没有任何目录迭代器的常规方法。我正在使用来自网站的升级版1.54下载源代码。我也使用Qt Creator(2.8.1),它对directory_iterator的自动完成没有显示任何有用的功能。我用boost来获取文件的file_size(),所以我认为它已正确安装。我还看了一下被弃用的内容,似乎无法在directory_iterator上找到任何内容。
我试过
itr.is_directory
*itr.is_directory
boost::filesystem::is_directory(itr->status()) //doesn't have the member function status
boost::filesystem::is_directory(boost::filesystem::status(itr))
itr.status();
itr->status();
这是Bartosz Milewski的例子(尚未完成)的代码
测试2.cpp
#include <iostream>
#include <string>
#include <thread>
#include <future>
#include <chrono>
#include <vector>
#include <boost/filesystem.hpp>
typedef std::vector<std::string> string_vector;
namespace fs=boost::filesystem;
string_vector listDirectory(std::string && dir)
{
string_vector listing;
std::string dirStr("\n> ");
dirStr += dir;
dirStr += ":\n";
listing.push_back(dirStr);
std::vector<std::future<string_vector>> futures;
for (fs::directory_iterator itr(dir); itr !=fs::directory_iterator(); ++itr)
{
if(itr.is_directory); 这是我需要找到的目录
{
}
else
{
}
}
return listing;
}
int main()
{
std::string root= "/home/craig/";
auto ftr = std::async(std::launch::async, &listDirectory, root);
try
{
string_vector listing = ftr.get();
}
}
自动完成在Qt Creator中显示以下内容(在括号中自动完成)
itr-> [mref, operator ->,operator Reference *,proxy]
答案 0 :(得分:0)
试试这样:
if (itr->status().type() == boost::filesystem::directory_file) {
// ...
}
答案 1 :(得分:0)
虽然我不知道如何让qt creator自动完成boost的文件系统directory_iterator,但是我想发布工作示例程序以防其他人在这里结束。另请注意,root已更改为/ home / craig / Documents,因为上面的目录导致太多线程无法正常运行(资源暂时不可用)我认为在下一部分(第6部分)Bartosz限制了多少线程可以生产。
#include <iostream>
#include <string>
#include <thread>
#include <future>
#include <chrono> //don't need this, for this program, but is in the example
#include <vector>
#include <boost/filesystem.hpp>
typedef std::vector<std::string> string_vector;
namespace fs=boost::filesystem;
string_vector listDirectory(std::string && dir)
{
string_vector listing;
std::string dirStr("\n> ");
dirStr += dir;
dirStr += ":\n";
listing.push_back(dirStr);
std::vector<std::future<string_vector>> futures;
for (fs::directory_iterator itr(dir); itr !=fs::directory_iterator(); ++itr)
{
if (fs::is_directory(itr->status()))
{
auto ftr =std::async(std::launch::async,&listDirectory,std::move(itr->path().string()));
futures.push_back(std::move(ftr));
}
else
{
listing.push_back(std::move(itr->path().filename().string()));
}
}
for(auto &ftr:futures)
{
string_vector lst = ftr.get();
std::move(lst.begin(),lst.end(),std::back_inserter(listing));
}
return listing;
}
int main()
{
std::string root= "/home/craig/Documents/";
auto ftr = std::async(std::launch::async, &listDirectory, std::move(root));
try
{
string_vector listing = ftr.get();
for (auto &s:listing)
{
std::cout << s << " ";
}
}
catch(std::exception & e)
{
std::cout << e.what() << std::endl;
}
catch(...)
{
std::cout << "unknown exception" <<std::endl;
}
}