【问题标题】:Obtaining a SubDir as a string return type获取 SubDir 作为字符串返回类型
【发布时间】:2012-08-04 03:49:37
【问题描述】:

我正在尝试在指定文件夹(我们称之为 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# 初学者指南我'已经通读了互联网......我已经勇敢地搜索了这两个具体问题,但无济于事......因此,非常感谢任何帮助或指针!

【问题讨论】:

    标签: c# string recursion


    【解决方案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 + "\".");
    }
    

    【讨论】:

    • 这也很有效,但是对于我布置的特定实例,上面的答案在代码方面要简单得多。我绝对不知道这种查找文件的方法,因此无论如何都非常感谢您的响应!
    【解决方案2】:

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

    【讨论】:

    • 无论我如何尝试,我都无法让它工作。当首先设置文件循环时,它总是返回 NULL。问题已由另一位用户回答,但还是感谢您的回复。
    【解决方案3】:

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

    类似

    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)
    

    【讨论】:

    • 这太简单了,而且效果很好..只是不知道 SearchOption 参数。非常感谢,尤其是原始建议的链接和补充。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2012-12-11
    • 2015-12-17
    • 2020-09-05
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多