2

Linux OpenSUSE 12.3 32 ビットの使用

YouTube で Bartosz Milewski の c++11 同時実行ビデオを見ています。パート 5 では、ディレクトリとそのサブディレクトリ内のすべてのファイルを読み取るために複数のスレッドが生成される例で、彼は独自の filesystem.h ファイルを使用します。それで、boost のファイルシステム メソッドにアクセスできないので、boost のファイル システム メソッドを使用することにしました。directory_iterator で is_directory を呼び出す方法がわかりません。

実際、ディレクトリ反復子の通常のメソッドはないようです。サイトからダウンロードしたブースト バージョン 1.54 のソースを使用しています。Qt Creator (2.8.1) も使用していますが、directory_iterator のオートコンプリートには便利な機能が表示されません。ファイルの file_size() を取得するためにboostを使用したので、正しくインストールされたと思います。また、廃止されたものも調べましたが、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 の例のコードです (まだ完成していません)。

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)
    {  

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]
4

2 に答える 2

0

qt クリエーターにブーストのファイルシステム directory_iterator をオートコンプリートさせる方法がわかりませんが、他の誰かがここにたどり着いた場合に備えて、動作するサンプル プログラムを投稿したいと思いました。また、ルートが /home/craig/Documents に変更されたことにも注意してください。これは、その上のディレクトリが原因でスレッドが多すぎて正しく実行できなくなったためです (リソースが一時的に利用できません)。生産される。

#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 に答える