7

現在、すべてのフォルダーとサブフォルダーを取得して、作成中の小さなツールのACLをチェックする関数がありますが、到達できる深さを制限する方法を見つけようとして、髪の毛を抜いています。たとえば、4レベルの深さのフォルダがありますが、ACL用に3レベルしか取得できないようにしたいです。

現在、私はそれをこのようにコーディングしています:

private void StepThroughDirectories(string dir)
{
    string[] directories = Directory.GetDirectories(dir);
    try
    {
        foreach (string d in Directory.GetDirectories(dir))
        {
            if (recCount < (int)Depth)
            {
                GetACLs(d, new DirectoryInfo(d));
                pBar.Value += 1;
                //MessageBox.Show("Recursive Level: " + counter.ToString());
                recCount++;
                StepThroughDirectories(d);
            }
            else
            {
                recCount--;
            }
        }
    }
    catch (System.Exception e)
    {
        Console.WriteLine(e.Message);
    }
}

明らかに、私はしばらくの間問題に取り組んできたので、それは以前ほど良くありませんでしたが、誰かがこの問題を解決するために正しい方向に私を向けることができれば、私はとても幸せです!

4

3 に答える 3

17

まず、recCount外部のフィールドを「グローバル」変数として宣言することは避けてください。再帰的なシナリオでは、通常、再帰的な呼び出しに沿って状態を渡す方が管理しやすくなります。

次に、深度テストをから移動して、foreachサブディレクトリに対するファイルシステムの不要なクエリを削除します。

3番目に、実際の処理ロジックをメソッドの先頭に配置します。これもサブディレクトリの処理ループの外にあります。

コードは次のようになります。

void StepThroughDirectories(string dir)
{
    StepThroughDirectories(dir, 0)
}

void StepThroughDirectories(string dir, int currentDepth)
{
    // process 'dir'
    ...

    // process subdirectories
    if (currentDepth < MaximumDepth)
    {
        foreach (string subdir in Directory.GetDirectories(dir))
            StepThroughDirectories(subdir, currentDepth + 1);
    }
}
于 2010-10-06T16:11:42.143 に答える
4

考えられるメソッドの1つは、メソッドの外部にクラスフィールドを追加し、変数を追加して、最大になるレベルの深さを示します。

intレベル;

private void StepThroughDirectories(string dir, int depth)
{
    levels ++;
    if (levels > depth)
        return;
    string[] directories = Directory.GetDirectories(dir);
    try
    { ...
于 2010-10-06T16:10:31.880 に答える
2

StepThroughDirectoriesから戻るときにrecCountをデクリメントしますが、これはより良いでしょう...

    private void StepThroughDirectories(string dir, int depth)
    {
        if (depth < 0)
            return;
        string[] directories = Directory.GetDirectories(dir);
        try
        {
            foreach (string d in Directory.GetDirectories(dir))
            {
                // your code here
                Console.WriteLine("{0}", d);
                StepThroughDirectories(d, depth-1);
            }
        }
        catch (System.Exception e)
        {
            Console.WriteLine(e.Message);
        }
    } 
于 2010-10-06T16:10:50.303 に答える