C++ boost版本1.54 boost::filesystem::directory\u迭代器,尝试使用is\u directory函数

C++ boost版本1.54 boost::filesystem::directory\u迭代器,尝试使用is\u directory函数,c++,boost,boost-filesystem,C++,Boost,Boost Filesystem,使用Linux OpenSUSE 12.3 32位 我正在youtube上浏览Bartosz Milewski的c++11并发视频。在第5部分中,他在一个示例中使用了自己的filesystem.h文件,其中生成了多个线程来读取目录及其子目录中的所有文件。所以我决定使用boost的文件系统方法,因为我没有访问他的文件系统的权限。我不知道如何在目录迭代器上调用is_目录 事实上,我似乎没有任何常规的目录迭代器方法。我使用的是从网站下载的boost版本1.54。我还使用QtCreator(2.8.1)

使用Linux OpenSUSE 12.3 32位

我正在youtube上浏览Bartosz Milewski的c++11并发视频。在第5部分中,他在一个示例中使用了自己的filesystem.h文件,其中生成了多个线程来读取目录及其子目录中的所有文件。所以我决定使用boost的文件系统方法,因为我没有访问他的文件系统的权限。我不知道如何在目录迭代器上调用is_目录

事实上,我似乎没有任何常规的目录迭代器方法。我使用的是从网站下载的boost版本1.54。我还使用QtCreator(2.8.1),它对目录迭代器的自动完成不会显示任何有用的函数。我使用boost获取文件的file_size(),因此我假设它安装正确。我还查看了不推荐使用的内容,在目录迭代器上似乎找不到任何内容

我试过了

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示例中的代码(尚未完成)

test2.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)
    {  
自动完成在Qt Creator中显示以下内容(括号中为自动完成)

试着这样做:

if (itr->status().type() == boost::filesystem::directory_file) {
    // ...
}

虽然我不知道如何让qt creator自动完成boost的文件系统目录迭代器,但我想发布一个工作示例程序,以防其他人出现在这里。还请注意,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;
    }
}
#包括
#包括
#包括
#包括
#include//此程序不需要此选项,但在示例中
#包括
#包括
typedef std::向量字符串\ u向量;
名称空间fs=boost::filesystem;
字符串向量列表目录(std::string&&dir)
{
字符串向量列表;
std::string dirStr(“\n>”);
dirStr+=dir;
dirStr+=“:\n”;
listing.push_back(dirStr);
向量期货;
for(fs::directory_iterator itr(dir);itr!=fs::directory_iterator();++itr)
{
if(fs::is_目录(itr->status())
{
auto-ftr=std::async(std::launch::async,&listDirectory,std::move(itr->path().string());
期货。后推(标准::移动(ftr));
}
其他的
{
listing.push_back(std::move(itr->path().filename().string());
}
}
用于(汽车和ftr:期货)
{
string_vector lst=ftr.get();
std::move(lst.begin()、lst.end()、std::back_插入器(清单));
}
返回列表;
}
int main()
{
std::string root=“/home/craig/Documents/”;
auto-ftr=std::async(std::launch::async,&listDirectory,std::move(root));
尝试
{
string_vector list=ftr.get();
用于(自动&s:列表)
{

std::cout正如我所说,目录迭代器没有状态函数,因此显然不起作用实际上我尝试了一个简化的程序,状态显然起作用,对此表示抱歉。所以我确实有一个qt创建者问题,因为它没有拉入任何自动完成的函数。这使得我的整个问题毫无意义许多auto-cOpple经常在复杂的C++库上出错(或者花很长时间),如果代码是正确的,代码应该编译得很好。
if (itr->status().type() == boost::filesystem::directory_file) {
    // ...
}
#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;
    }
}