使用模式的 C# 递归查找文件

本文关键字:递归 查找 文件 模式 | 更新日期: 2023-09-27 18:37:07

我有一个具有以下结构的Visual Studio解决方案:

- root
 - src
  - project01
  - project02
 - config
  - application.config
  - database.dacpac

现在,假设我正在从路径执行代码:

C:'DEV'root'project01'bin'release'project01.exe

例如,如何找到文件"application.config"的第一个出现

我知道我可以从这个开始:

public string GetExecutingDirectory(){
{
   string codeBase = Assembly.GetExecutingAssembly().CodeBase;
   UriBuilder uri = new UriBuilder(codeBase);
   string path = Uri.UnescapeDataString(uri.Path);
   return Path.GetDirectoryName(path);
}

并按以下方式使用它:

var executingDirectory = GetExecutingDirectory();

但是现在,我如何来回遍历根树,直到找到我要查找的文件?我尝试了这段代码,但它没有找到任何东西:

var path = Directory
   .GetFiles(executingDirectory, 
      "**/application.config", 
      System.IO.SearchOption.AllDirectories);

我需要它,因为我正在从不同的路径运行集成测试,他们需要这些文件,这些文件可以位于解决方案树的不同位置,具体取决于 DEV 机器配置,所以我需要使用"模式",因为结构可能因 PC 而异。

使用模式的 C# 递归查找文件

你可以这样做:

static string FindConfig()
{
    string appFolder = Path.GetDirectoryName(@"C:'DEV'root'project01'bin'release'project01.exe");
    string configPath = null;
    while (true)
    {
        Console.WriteLine(appFolder);
        string[] files = Directory.GetFiles(appFolder, "*application.config", SearchOption.AllDirectories);
        foreach (var file in files)
        {
            if (file.ToLower().EndsWith(@"'application.config"))
            {
                return file;
            }
        }
        appFolder = Path.GetDirectoryName(appFolder);
        if (appFolder.Length < 4) // "C:'" don't search root drive
        {
            break;
        }
    }
    return configPath;
}