2

我试图在指定文件夹的子目录中找到一个文件(我们称之为 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# 初学者指南和互联网...而且我已经勇敢地搜索了这两个具体问题,但无济于事..因此,非常感谢任何帮助或指示!

4

3 回答 3

6

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

就像是

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

看看Directory.GetFiles Method (String, String, SearchOption)SearchOption Enumeration

甚至是DirectoryInfo

就像是

new DirectoryInfo(@"C:\MyFolder\").GetFiles("blah.txt", SearchOption.AllDirectories)
于 2012-08-07T06:56:40.923 回答
1

将文件循环移动到目录循环之前。更改返回到 dir 而不是 dName。

于 2012-08-07T06:57:06.557 回答
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 + "\".");
}
于 2012-08-07T07:05:02.743 回答