我正在尝试在指定文件夹的子目录中找到一个文件(让我们称之为MyFolder)并将子目录保存到字符串变量中以便在别处使用。问题是,该指定文件夹中可能有多个子目录,每个子目录可能包含自己的子目录。 MyFolder下的树中只有一个所述子目录具有我正在寻找的文件。
在下面的示例中,它可能位于(可能更多,但对于此示例)两个位置中的任何一个,但从不两者。
-Root
--/MyFolder
---/a
-----/aa
-------------/blah.txt (or if not here, it may be...)
---/b
-------/blah.txt (...right here, possibly)
我当然试图找到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";
}
}
我见过这样的工作的唯一方法就是你不是试图将路径保存为能够在其他地方使用的字符串(可能甚至是其他函数),而是将其立即显示为void返回类型,例如在控制台中(通过将返回更改为"Console.WriteLine(dName)"
并相应地修改函数调用)。
我是C#的新手,我以前唯一的编码体验是使用JavaScript和AutoHotkey
,所以我对这类语言的了解仍然非常有限,而我所拥有的只是一本C#初学者指南我已经阅读并通过互联网...我已经勇敢地搜索了这个特定的问题但是没有用。所以,任何帮助或指针都非常感谢!
答案 0 :(得分:6)
为什么不使用内置的递归搜索?
像
这样的东西Directory.GetFiles(@"C:\MyFolder\", "blah.txt", SearchOption.AllDirectories)
查看Directory.GetFiles Method (String, String, SearchOption)和SearchOption Enumeration
像
这样的东西new DirectoryInfo(@"C:\MyFolder\").GetFiles("blah.txt", SearchOption.AllDirectories)
答案 1 :(得分:1)
将文件循环移动到目录循环之前。 改变回归而不是名字。
答案 2 :(得分:1)
如何简单地选择Directory.EnumerateFiles()
找到的第一个?
var fileToSearch = "blah.txt";
var matchingFile = Directory.EnumerateFiles(dir, fileToSearch, SearchOption.AllDirectories)
.FirstOrDefault();
if(matchingFile != null)
{
Console.WriteLine("File found: " + matchingFile);
}
else
{
Console.WriteLine("Could nowhere below \"" + dir + "\" find the file \"" + fileToSearch + "\".");
}