【问题标题】:Getting all sub directories using recursion使用递归获取所有子目录
【发布时间】:2012-11-23 14:25:17
【问题描述】:

我正在获取计算机中所有目录和子目录的列表。 我正在使用递归。

在我执行实际递归之前没关系

我收到此错误:

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("");
        }
     }  

如您所见,最后一个 for each 获取目录中的子目录列表并再次调用该函数执行递归。

此类从逻辑驱动程序接收所有顶级目录并深入到最后一个目录结构。

【问题讨论】:

  • 你在哪里设置过 subDirs 的值?它是空的。
  • recursiveFileTree.cs 的第 93 行是哪一行?这应该可以为您提供有关问题所在的线索。虽然如果我不得不猜测,我怀疑潜在的问题是某个地方的堆栈溢出。我相信,如果您深入了解 System.IO,您会发现它会跳入不安全的代码中来发挥它的魔力。
  • 如果你想枚举所有目录,避开AllDirectories 选项是没有意义的。

标签: c# asp.net asp.net-mvc recursion asp.net-mvc-4


【解决方案1】:

你不关心System.IO.DirectoryInfo[] subDirs = null;

但你使用DirectoryInfo[] SubDirs

【讨论】:

    【解决方案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);
    }
    

    【讨论】:

      【解决方案3】:

      C# 区分大小写,

      SubDirs 不是subdirs

      你声明两者,使用两者但只实例化一个。


      你的净化函数(不是类)应该是,

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

      但是,将log 传递给函数是有意义的。

      【讨论】:

        猜你喜欢
        • 2011-02-04
        • 2020-01-31
        • 1970-01-01
        • 2018-11-15
        • 1970-01-01
        • 2010-12-31
        • 1970-01-01
        • 1970-01-01
        • 2017-05-18
        相关资源
        最近更新 更多