我想获取文件夹的所有子目录列表,包括嵌套的子目录
因此,我希望有一个list<Folder> myList
将由递归方法填充。
void myMethod(?)
{
list<Folder> listFolders = ... ;
foreach (Folder curFolder in listFolders)
{
myList.add(curFolder);
}
}
有可能吗?
答案 0 :(得分:5)
声明一个像这样的函数
List<Folder> ListFolders(Folder initialFolder)
{
var folders = new List<Folder>();
folder.Add(initialFolder);
foreach (var f in initialFolder.GetSubFolders())
{
folders.AddRange(ListFolders(f));
}
return folders;
}
Folder
类留给你作为练习,它必须包含当前文件夹的名称,以及获取其子文件夹的方法(提示:查看System.IO.Directory
类)
答案 1 :(得分:1)
以下是一个从IEnumerable递归中选择的扩展方法:
public static IEnumerable<T> SelectRecursive<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> recursiveSelector)
{
foreach (var i in source)
{
yield return i;
var directChildren = recursiveSelector(i);
var allChildren = SelectRecursive(directChildren, recursiveSelector);
foreach (var c in allChildren)
{
yield return c;
}
}
}
您可以使用它来创建一个&#34; flat&#34;可以从每个层次结构中枚举出来。假设Folder类有一个返回其直接子节点的属性:如下所示:
public class Folder
{
public IEnumerable<Folder> Children {get;}
}
您将能够获得包含以下行的子文件夹的平面列表:
var flatList = folder.SelectRecursive(f => f.Children).ToList();
希望这就是你的意思。
答案 2 :(得分:0)
static void Main(string[] args)
{
List<string> dirs = new List<string>();
addDirectoryToList(@"C:\exampledir\", dirs);
}
void addDirectoryToList(string dir, List<string> list)
{
DirectoryInfo dirInfo = new DirectoryInfo(dir);
foreach (DirectoryInfo subdir in dirInfo.GetDirectories())
{
addDirectoryToList(subdir.FullName, list);
}
}
或没有递归:
void addDirectoryToList(string dir, List<string> list)
{
DirectoryInfo dirInfo = new DirectoryInfo(dir);
list.Add(dir);
foreach (DirectoryInfo subdir in dirInfo.GetDirectories("*", SearchOption.AllDirectories))
{
list.Add(subdir.FullName);
}
}