7

ディレクトリへのパスがあり、そのすべてのサブディレクトリをトラバースして、ファイルのパスを収集したいと考えています。

namespace fs = boost::filesystem;

std::vector<fs::path> traverse_if_directory(fs::path& f) {
    std::vector<fs::path> result;
    if (fs::is_directory(f)) {      
        for (fs::recursive_directory_iterator it(f), eit; it != eit; ++it) {
            if (!fs::is_directory(it->path())) {
                result.push_back(it->path());
            }       
        }
    }
    else {
        result.push_back(f);
    }

    return result;
}

残念ながら、トラバースの途中で、見る権利のないディレクトリに出くわし、上記のコードがスローされます。しかし、明らかに、このシナリオでは例外ではありません。このロックされたディレクトリをスキップして続行する必要があります。

しかし、どうすればこれを行うことができますか?

4

2 に答える 2

9

ハ、それを考え出した、方法があります:

std::vector<fs::path> traverse_if_directory(fs::path& f) {
    std::vector<fs::path> result;
    boost::system::error_code ec;

    if (fs::is_directory(f)) {      
        for (
             fs::recursive_directory_iterator it(f, ec), eit;
             it != eit;
             it.increment(ec)
            ) {
            if (ec) {
                it.pop();
                continue;
            }
            if (!fs::is_directory(it->path())) {
                result.push_back(it->path());
            }
        }
    }
    else {
        result.push_back(f);
    }

    return result;
}

type の出力パラメーターを受け入れるスローしないオーバーロードがあるboost::system::error_codeため、エラーが発生したかどうかをインクリメントごとに確認できます。

于 2013-04-12T12:20:06.440 に答える
1

最後のディレクトリ エントリでエラーが発生すると、Joker_vD の回答がクラッシュします。たとえば、ターゲット ディレクトリにアクセス許可のない単一のサブディレクトリが含まれている場合などです。原因は明らかに不要な「it.pop()」です。また、「続行」は次のエントリをスキップするため、実行しないでください。エラーの後、反復子はすでに次の有効なエントリを指しているか、終了反復子と同じです。

これは修正版です:

std::vector<fs::path> traverse_if_directory(const fs::path& f) {
    std::vector<fs::path> result;
    boost::system::error_code ec;

    if (fs::is_directory(f)) {
        for (fs::recursive_directory_iterator it{f, ec}, end; it != end; it.increment(ec)) {
            if (!fs::is_directory(it->path())) {
                result.push_back(it->path());
            }
        }
    }
    else {
        result.push_back(f);
    }

    return result;
}
于 2018-03-29T12:21:44.217 に答える