现在,我知道关于文件夹递归和获取一个文件夹(包括它的子目录等)已经有很多问题了,但是我没有发现任何与我在这里遇到的情况有关的问题。
我的问题如下:
我从这里 (页面底部)获取了关于文件夹递归的代码片段,并根据我的需要对其进行了调整;也就是说,它没有将所有(子)目录写入控制台,而是将它们添加到列表中。下面是我的代码(请注意注释掉的部分):
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
[...]在花了几个小时研究可能是我的错误之后,我很绝望。有人知道是什么导致了我的问题吗?
发布于 2015-06-14 11:14:33
将您的方法修改为
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);通过这种方式,可以防止其他答案中的许多列表创建和内存消耗。通过使用这种方式,您可以向该方法提供一个初始列表,它将向该方法添加所有条目,但其他答案将每次生成一个列表,然后将结果复制到上一列表,这将导致大量内存分配、复制和取消分配。
发布于 2015-06-14 11:11:36
在对ShowAllFoldersUnder的递归调用中发现的文件夹中,您似乎什么也不做。
这个修改应该能解决这个问题。更改:
ShowAllFoldersUnder(folder);至:
folderList.AddRange(ShowAllFoldersUnder(folder));在生产代码中,我可能会重构它,在整个递归过程中使用单个List,以避免创建和合并多个列表的任何开销。
发布于 2015-06-14 11:11:22
方法ShowAllFoldersUnder返回一个字符串列表,但是只有在'main‘方法中才能实际使用它,在’main‘方法中将它们写入Console。
你需要改变
ShowAllFoldersUnder(folder);至
folderList.AddRange(ShowAllFoldersUnder(folder));https://stackoverflow.com/questions/30828642
复制相似问题