0

に慣れるために<filesystem>、ディレクトリ ツリーをたどる単純な再帰関数を作成しました。

#include <filesystem>

namespace fs = std::tr2::sys;
const fs::directory_iterator fs_end;

void walk(fs::path root)
{
    std::cout << "ENTERING " << root << '\n';
    for (auto it = fs::directory_iterator(root); it != fs_end; ++it)
    {
        if (is_directory(it->status()))
        {
            walk(it->path());
        }
        else
        {
            std::cout << it->path() << " is not a directory\n";
        }
    }
    std::cout << "LEAVING " << root << '\n';
}

int main()
{
    walk("d:/a");
}

残念ながら、これは で指定されたディレクトリ内の直接のディレクトリにしかアクセスしませんmain。サブディレクトリはアクセスされません。説明のために、非常に単純なディレクトリ構造を作成しました。

あいうえお

プログラムの出力は次のとおりです。

ENTERING d:/a
ENTERING b
LEAVING b
ENTERING c
LEAVING c
LEAVING d:/a

ご覧のとおり、d はアクセスされていません。明らかに、for ループは c 内で 0 回実行されます。なんで?

4

1 に答える 1

1

it->path()出力から、絶対パスではなく相対パスを提供しているように見えます。反復中、現在のディレクトリは変更されないため、パス 'b' または 'c' のディレクトリを反復しようとしても機能せず、その存在しないディレクトリにサブディレクトリは見つかりません。for ループで、次の再帰呼び出しを試してください。

walk(root/it->path());

ここで、プログラムがディレクトリ c を調べると、次のように出力されます。

ENTERING d:/a/c 
ENTERING d:/a/c/d
etc...
于 2013-08-29T15:27:22.630 に答える