【发布时间】:2018-08-13 05:23:36
【问题描述】:
我编写了一个函数来递归文件夹结构,但它没有按预期工作。预期的行为是返回传递的根文件夹的文件,然后进入第一个文件夹,返回这些文件,然后进入第一个文件夹的第一个子文件夹并列出这些文件,等等。
相反,我设法让它首先返回所有 1 级文件夹,然后是所有 2 级文件夹,然后是所有 3 级文件夹等。我可以看到有什么问题,但我不确定如何解决它。
我怎样才能重写它以获得我预期的行动方案?
static IEnumerable<string> recurseFolder(String Folder)
{
if (Directory.Exists(Folder))
{
string[] files = null;
string[] dirs = null;
try { files = Directory.GetFiles(Folder); } catch (Exception) { }
if (files != null)
{
foreach (var item in files)
{
yield return item;
}
}
try { dirs = Directory.GetDirectories(Folder); } catch (Exception) { }
if (dirs != null)
{
foreach (var dir in dirs)
{
foreach (var item in recurseFolder(dir))
{
yield return item;
}
}
}
}
}
更新 1 这可能与 Linux 和 Windows 上的 dotnet core 不一致,这是我在 Windows 上的结果,也是我期望的结果。
d:\root\Folder A\File 1.txt
d:\root\Folder A\Folder B\File 2.txt
d:\root\Folder A\Folder B\Folder C\File 3.txt
d:\root\Folder A\Folder B\Folder D\File 4.txt
d:\root\Folder A\Folder E\File 5.txt
d:\root\Folder A\Folder F\File 6.txt
d:\root\Folder A\Folder F\Folder G\File 7.txt
d:\root\Folder H\File 8.txt
d:\root\Folder H\Folder I\File 9.txt
d:\root\Folder H\Folder I\Folder J\File 10.txt
d:\root\Folder H\Folder I\Folder K\File 11.txt
d:\root\Folder H\Folder L\File 12.txt
d:\root\Folder M\File 13.txt
这是我在 Linux 上的结果
/home/x/Root/Folder A/File 1.txt
/home/x/Root/Folder A/Folder E/File 5.txt
/home/x/Root/Folder A/Folder B/File 2.txt
/home/x/Root/Folder A/Folder B/Folder D/File 4.txt
/home/x/Root/Folder A/Folder B/Folder C/File 3.txt
/home/x/Root/Folder A/Folder F/File 6.txt
/home/x/Root/Folder A/Folder F/Folder G/File 7.txt
/home/x/Root/Folder H/File 8.txt
/home/x/Root/Folder H/Folder I/File 9.txt
/home/x/Root/Folder H/Folder I/Folder K/File 11.txt
/home/x/Root/Folder H/Folder I/Folder J/File 10.txt
/home/x/Root/Folder H/Folder L/File 12.txt
/home/x/Root/Folder M/File 13.txt
也许我的代码正在运行,但我只需要手动按字母顺序对目录进行排序,我想知道 linux 是否以创建或修改的日期顺序返回它们。
【问题讨论】:
-
您可能想知道
Directory.GetFiles有一个需要SearchOption的重载,您可以告诉它搜索所有子目录。 msdn.microsoft.com/en-us/library/ms143316(v=vs.110).aspx -
为什么不将 SearchOption.AllDirectoreis 传递给 GetFiles 中的递归目录?您是否试图避免您无权访问的文件夹,或者试图列出
C:或C:\Windows中的所有文件? -
避免捕获异常 - 例如,您真的想捕获 OutOfMemoryException 吗?
-
有一个静态的
List<>然后获取所有文件名Directory.GetFiles并获取所有文件夹名称Directory.GetDirectories然后为每个文件夹再次调用相同的方法。继续在静态列表中插入文件名 -
@donggas90 有时用例子解释比用描述误解更容易。