The*_*ofX 2 c# string recursion
我正在尝试在指定文件夹的子目录中找到一个文件(让我们称之为MyFolder)并将子目录保存到字符串变量中以便在别处使用.问题是,该指定文件夹中可能有多个子目录,每个子目录可能包含自己的子目录.MyFolder下的树中只有一个所述子目录具有我正在寻找的文件.
在下面的示例中,它可以是(可能更多,但对于此示例)两个位置中的任一个,但从不两者.
-Root
--/MyFolder
---/a
-----/aa
-------------/blah.txt (or if not here, it may be...)
---/b
-------/blah.txt (...right here, possibly)
Run Code Online (Sandbox Code Playgroud)
blah.txt当然,我正试图找到它.
我已经做了一个递归foreach循环,如下所示,但如果在第一级子目录中找到该文件,它将只返回子目录(/a, or /b).如果文件在/aa or /bb或更深(root/a/aa/aaa,例如),则每次都返回NULL.我花了几个小时试图通过慢慢地通过调试器并密切观察本地窗口来解决这个问题,但我似乎无法弄清楚出了什么问题.它确实找到了文件并在第二个foreach循环中存储了正确的子目录路径,但是由于某种原因,它开始向后循环(显示之前的目录,直到它到达return "Null";).如果在第一级子目录中找到该文件,则不会发生这种情况,只有当它在第二级或更深层次中找到时才会发生.
class Program
{
static string dir = @"C:\MyFolder\";
static void Main(string[] args)
{
Console.WriteLine(GetDirectory(dir));
Console.ReadKey();
}
static string GetDirectory(string dir)
{
foreach (string dName in Directory.GetDirectories(dir))
{
foreach (string fName in Directory.GetFiles(dName, "blah.txt"))
{
return dName;
}
GetDirectory(dName);
}
return "NULL";
}
}
Run Code Online (Sandbox Code Playgroud)
我见过这样的工作的唯一方法是,如果你不是试图将路径保存为能够在其他地方使用的字符串(可能甚至是其他函数),而是将它立即显示为void返回类型,例如在控制台中(通过更改返回"Console.WriteLine(dName)"并适当地修改函数调用).
我对C#很陌生,我以前唯一的编码经验是使用JavaScript AutoHotkey,因此我对这类语言的了解仍然非常有限,而且我所拥有的只是一本C#初学者指南,我已经阅读并通过互联网...而且我已经勇敢地搜索了这个特定的问题但是没有用.所以,任何帮助或指针都非常感谢!
为什么不使用内置的递归搜索?
就像是
Directory.GetFiles(@"C:\MyFolder\", "blah.txt", SearchOption.AllDirectories)
Run Code Online (Sandbox Code Playgroud)
查看Directory.GetFiles方法(String,String,SearchOption)和SearchOption枚举
甚至是DirectoryInfo.
就像是
new DirectoryInfo(@"C:\MyFolder\").GetFiles("blah.txt", SearchOption.AllDirectories)
Run Code Online (Sandbox Code Playgroud)