2

使用 Linux OpenSUSE 12.3 32 位

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

事实上,我似乎没有任何目录迭代器的常规方法。我正在使用从站点下载的 boost 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)
    {  

如果(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]
4

2 回答 2

0

试试这样:

if (itr->status().type() == boost::filesystem::directory_file) {
    // ...
}
于 2013-09-23T19:27:01.300 回答
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;
    }
}
于 2013-09-24T03:18:05.363 回答