8

次を使用して、ディレクトリ内のすべてのファイルを再帰的に反復処理しています。

try
{
    for ( bf::recursive_directory_iterator end, dir("./");
          dir != end; ++dir )
    {
       const bf::path &p = dir->path();
       if(bf::is_regular_file(p))
       {
           std::cout << "File found: " << p.string() << std::endl;
       }
    }
} catch (const bf::filesystem_error& ex) {
    std::cerr << ex.what() << '\n';
}

ただし、これには隠しファイルと隠しディレクトリ内のファイルが含まれます。

これらのファイルを除外するにはどうすればよいですか? 必要に応じて、隠しファイルとディレクトリが「.」で始まるプラットフォームに制限できます。キャラクター。

4

2 に答える 2

5

残念ながら、「非表示」を処理するクロスプラットフォームの方法はないようです。以下は、Unix ライクなプラットフォームで機能します。

最初に次を定義します。

bool isHidden(const bf::path &p)
{
    bf::path::string_type name = p.filename();
    if(name != ".." &&
       name != "."  &&
       name[0] == '.')
    {
       return true;
    }

    return false;
}

次に、ファイルのトラバースは次のようになります。

try
{
    for ( bf::recursive_directory_iterator end, dir("./");
           dir != end; ++dir)
    {
       const bf::path &p = dir->path();

       //Hidden directory, don't recurse into it
       if(bf::is_directory(p) && isHidden(p))
       {
           dir.no_push();
           continue;
       }

       if(bf::is_regular_file(p) && !isHidden(p))
       {
           std::cout << "File found: " << p.string() << std::endl;
       }
    }
} catch (const bf::filesystem_error& ex) {
    std::cerr << ex.what() << '\n';
}
于 2012-10-05T00:31:16.263 に答える
1

ここでは、.で始まるファイルを無視すると仮定しましょう'.'。これは Unix における隠しファイルの標準的な表示です。各ファイルにアクセスする再帰関数を作成することをお勧めします。擬似コードでは、次のようになります。

visitDirectory dir
    for each file in dir
        if the filename of file does not begin with a '.'
            if file is a directory
                visitDirectory file
            else
                do something with file (perhas as a separate function call?)

これにより、ファイルを処理するかどうかを判断するためにファイルのパス全体を検索する必要がなくなります。代わりに、「非表示」のディレクトリはすべてスキップします。

それがあなたの好みであれば、いくつかの反復的な解決策も考えられます。1 つは、スタックまたはキューを使用して、次にアクセスするディレクトリを追跡することです。基本的に、これは独自のデータ構造で再帰バージョンをエミュレートします。または、ファイルのフル パスの解析に行き詰まっている場合は、絶対パスを取得するようにしてください。これにより、隠しファイルのチェックで問題を引き起こす「./」や「../」のような名前のディレクトリに遭遇しないことが保証されます。

于 2012-10-05T00:39:15.450 に答える