编写具有子目录的目录列表<string>

时间:2015-06-14 11:08:29

标签: c# .net list recursion directory

现在,我知道Stackoverflow上有很多关于文件夹递归和获取文件夹的问题,包括它的子目录等。但是我没有发现任何与我在这里遇到的内容有关的问题。 / p>

我的问题如下:

我从here(页面底部)获取了有关文件夹递归的代码片段,并根据我的需要进行了调整;也就是说,让它不将所有(子)目录写入控制台,而是让它将它们添加到列表中。这是我的代码(注意注释掉的部分):

private static List<String> ShowAllFoldersUnder(string path)
{
   var folderList = new List<String>();
   try
   {
      if ((File.GetAttributes(path) & FileAttributes.ReparsePoint)
         != FileAttributes.ReparsePoint)
      {
         foreach (string folder in Directory.GetDirectories(path))
         {
            folderList.Add(folder);
            // Console.WriteLine(folder);
            ShowAllFoldersUnder(folder);
         }
      }
   }
   catch (UnauthorizedAccessException) { }
   return folderList;
}

这就是我的称呼方式(Dir是包含路径的string):

var _folders = ShowAllFoldersUnder(Dir);
foreach (string folder in _folders)
{
    Console.WriteLine(folder);
}

问题是只有第一级文件夹被添加到列表中,这意味着我的输出是例如:

[...]
C:\Users\Test\Pictures
C:\Users\Test\Recent
C:\Users\Test\Saved Games
C:\Users\Test\Searches
C:\Users\Test\SendTo
[...]

如果我从方法中取消注释Console.WriteLine(folder);,它会将所有(子)目录回显到控制台:

[...]
C:\Users\Test\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned
C:\Users\Test\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\ImplicitAppShortcuts
C:\Users\Test\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar
C:\Users\Test\AppData\Roaming\Microsoft\Internet Explorer\UserData
C:\Users\Test\AppData\Roaming\Microsoft\Internet Explorer\UserData\Low
C:\Users\Test\AppData\Roaming\Microsoft\MMC
C:\Users\Test\AppData\Roaming\Microsoft\Network
[...]

在花了几个小时研究可能是我的错误后,我很绝望。有没有人知道是什么原因引起了我的问题?

3 个答案:

答案 0 :(得分:3)

ShowAllFoldersUnder的递归调用中找到的文件夹似乎没有任何作用。

此修改应解决此问题。变化:

ShowAllFoldersUnder(folder);

为:

folderList.AddRange(ShowAllFoldersUnder(folder));

在生产代码中,我可能会重构它以在整个递归过程中使用单个List,以避免创建和合并多个列表的任何开销。

答案 1 :(得分:2)

方法ShowAllFoldersUnder会返回一个字符串列表,但是您实际使用它的唯一时间是在'main'方法中,您将它们写入Console

您需要更改

ShowAllFoldersUnder(folder);

folderList.AddRange(ShowAllFoldersUnder(folder));

答案 2 :(得分:2)

将您的方法修改为此

private static void ShowAllFoldersUnder(string path, List<string> folderList)
{
   try
   {
      if ((File.GetAttributes(path) & FileAttributes.ReparsePoint)
         != FileAttributes.ReparsePoint)
      {
         foreach (string folder in Directory.GetDirectories(path))
         {
            folderList.Add(folder);
            // Console.WriteLine(folder);
            ShowAllFoldersUnder(folder, folderList);
         }
      }
   }
   catch (UnauthorizedAccessException) { }
}

现在称之为

var _folders = new List<string>();
ShowAllFoldersUnder(Dir, _folders);

这样可以防止在其他答案中创建许多列表和内存消耗。通过使用这种方式,您为方法提供了一个初始列表,它将向其添加所有条目,但其他答案将每次生成一个列表,然后将结果复制到上层列表,这将导致大量内存分配,复制和解除分配。