0

コンピュータ内のすべてのディレクトリとサブディレクトリのリストを取得しています。再帰を使用しています。

実際の再帰を実行するまでは問題ありません

このエラーが発生します:

System.NullReferenceException: Object reference not set to an instance of an object. 
at tgpwebged.Views.Admin.recursiveFileTree.WalkDirectoryTree(DirectoryInfo root) 
in s:\Projects\tgpwebged\tgpwebged\Views\Admin\recursiveFileTree.cs:line 93

これはクラスです:

static void WalkDirectoryTree(System.IO.DirectoryInfo root)
    {
        System.IO.DirectoryInfo[] subDirs = null;

        try
        {
            DirectoryInfo[] SubDirs = root.GetDirectories("*.*", SearchOption.TopDirectoryOnly);

            foreach(DirectoryInfo sdir in SubDirs) {
                log.Add(sdir.ToString());
            }

        }
        catch (Exception e)
        {
            log.Add("Exceção: " + e.ToString());
        }

        try
        {
            foreach (System.IO.DirectoryInfo dirInfo in subDirs)
            {
                log.Add(dirInfo.ToString());
                WalkDirectoryTree(dirInfo);
            }
        }
        catch (Exception e)
        {
            log.Add("Exceção: " + e.ToString());
            log.Add("");
        }
     }  

ご覧のとおり、それぞれの最後はdir内のサブディレクトリのリストを取得し、再帰を実行する関数を再度呼び出します。

このクラスは、論理ドライバーからすべての最上位ディレクトリを受け取り、最後のディレクトリ構造に深く入ります。

4

3 に答える 3

2

大文字と小文字が異なる同じ名前の2つの異なる変数があるようです。

System.IO.DirectoryInfo[] subDirs = null;
DirectoryInfo[] SubDirs = root.GetDirectories("*.*", SearchOption.TopDirectoryOnly);

繰り返しを試みてsubDirsいますが、実際にはどこにも設定していません。

// subDirs is always null because you never set it to anything other than null
// in the variable declaration
foreach (System.IO.DirectoryInfo dirInfo in subDirs)
{
    log.Add(dirInfo.ToString());
    WalkDirectoryTree(dirInfo);
}
于 2012-12-05T17:21:35.913 に答える
2

あなたはデルケアSystem.IO.DirectoryInfo[] subDirs = null;

しかし、あなたは使用しますDirectoryInfo[] SubDirs

于 2012-12-05T17:21:49.570 に答える
2

C#では大文字と小文字が区別されます。

SubDirsではありませんsubdirs

両方を宣言し、両方を使用しますが、インスタンス化するのは1つだけです。


サニタイズされた関数(クラスではない)は、

static void WalkDirectoryTree(System.IO.DirectoryInfo root)
{
    foreach(var subDirectory in root.GetDirectories(
        "*.*", 
        SearchOption.AllDirectories))
    {
        log.Add(subDirectory.ToString());
    }
}

ただし、関数に渡すことは理にかなってlogいます。

于 2012-12-05T17:21:59.813 に答える