首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用子目录编写目录的List<String>

用子目录编写目录的List<String>
EN

Stack Overflow用户
提问于 2015-06-14 11:08:29
回答 3查看 73关注 0票数 1

现在,我知道关于文件夹递归和获取一个文件夹(包括它的子目录等)已经有很多问题了,但是我没有发现任何与我在这里遇到的情况有关的问题。

我的问题如下:

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

代码语言:javascript
复制
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 ):

代码语言:javascript
复制
var _folders = ShowAllFoldersUnder(Dir);
foreach (string folder in _folders)
{
    Console.WriteLine(folder);
}

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

代码语言:javascript
复制
[...]
C:\Users\Test\Pictures
C:\Users\Test\Recent
C:\Users\Test\Saved Games
C:\Users\Test\Searches
C:\Users\Test\SendTo
[...]

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

代码语言:javascript
复制
[...]
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
[...]

在花了几个小时研究可能是我的错误之后,我很绝望。有人知道是什么导致了我的问题吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-14 11:14:33

将您的方法修改为

代码语言:javascript
复制
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) { }
}

现在就这样叫吧

代码语言:javascript
复制
var _folders = new List<string>();
ShowAllFoldersUnder(Dir, _folders);

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

票数 2
EN

Stack Overflow用户

发布于 2015-06-14 11:11:36

在对ShowAllFoldersUnder的递归调用中发现的文件夹中,您似乎什么也不做。

这个修改应该能解决这个问题。更改:

代码语言:javascript
复制
ShowAllFoldersUnder(folder);

至:

代码语言:javascript
复制
folderList.AddRange(ShowAllFoldersUnder(folder));

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

票数 3
EN

Stack Overflow用户

发布于 2015-06-14 11:11:22

方法ShowAllFoldersUnder返回一个字符串列表,但是只有在'main‘方法中才能实际使用它,在’main‘方法中将它们写入Console

你需要改变

代码语言:javascript
复制
ShowAllFoldersUnder(folder);

代码语言:javascript
复制
folderList.AddRange(ShowAllFoldersUnder(folder));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30828642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档