获取SubDir作为字符串返回类型

本文关键字:字符串 返回类型 SubDir 获取 | 更新日期: 2024-10-22 20:28:33

我试图在指定文件夹的子目录中找到一个文件(我们称之为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#初学者指南书和互联网。。。我勇敢地搜索了两者,但都没有找到这个具体的问题。。因此,任何帮助或建议都将不胜感激!

获取SubDir作为字符串返回类型

为什么不使用内置的递归搜索?

类似的东西

Directory.GetFiles(@"C:'MyFolder'", "blah.txt", SearchOption.AllDirectories)

查看Directory.GetFiles方法(String、String、SearchOption)和SearchOption枚举

甚至DirectoryInfo。

类似的东西

new DirectoryInfo(@"C:'MyFolder'").GetFiles("blah.txt", SearchOption.AllDirectories)

将文件循环移动到目录循环之前。将return改为dir而不是dName。

简单地取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 + "'".");
}