【问题标题】:How to search for a SINGLE file in c#如何在 C# 中搜索单个文件
【发布时间】:2016-01-26 16:03:09
【问题描述】:

我想在一个目录及其子目录中搜索单个文件。

目录树很大,我不想搜索所有目录树,只搜索第一个找到的文件。

目前我尝试了以下方法:

IEnumerable<string> files = Directory.EnumerateFiles(
Directory.GetCurrentDirectory(),
"myFile.ext",
SearchOption.AllDirectories);

myFileInfo = new FileInfo(files.First());

上面代码的问题是它搜索了所有的目录树。

我查找文件的主要重点是性能

【问题讨论】:

  • 您可能必须使用 DirectoryInfo 编写自己的目录迭代器,而不是使用 AllDirectories 选项搜索以获得您正在寻找的选项。
  • 在寻找更好的解决方案之前,您是否测量了 EnumerateFiles 的实际性能?
  • 你想做什么?您的代码将 遍历所有文件 - 它 一个枚举器,这意味着您可以在遍历整个树之前获得第一个结果。实际上,如果你使用DirectoryInfo.EnumerateFiles,你会直接得到一个FileInfo,不需要先获取路径,然后创建一个FileInfo
  • 这是你能找到的最快的方法,不同之处见here

标签: c# .net file directory


【解决方案1】:
String searchFile(String searchPath, String fileName)
{
    DirectoryInfo dir = new DirectoryInfo(searchPath);
    DirectoryInfo[] dirs = dir.GetDirectories();

    FileInfo[] files = dir.GetFiles();
    foreach (FileInfo file in files)
    {
        if (file.Name.Equals(fileName))
            return searchPath;
    }

    foreach (DirectoryInfo subDir in dirs)
    {
        String value = searchFile(Path.Combine(searchPath, subDir.Name), fileName);
        if (value != null)
            return value;
    }
    return null;
}

private void Form1_Load(object sender, EventArgs e)
{
    String searchPath = @"C:\PathHere";
    String searchFile = "log.txt";

    String foundFileAt = this.searchFile(searchPath, searchFile);
}

【讨论】:

    【解决方案2】:

    这个怎么样:

    public string FindFirstFile(string dir, string file)
    {
        if (System.IO.File.Exists(Path.Combine(dir, file)))
        {
            return Path.Combine(dir, file);
        }
        foreach (var subDir in System.IO.Directory.EnumerateDirectories(dir))
        {
            var result = FindFirstFile(subDir, file);
            if (result != null)
            {
                return result;
            }
        }
        return null;
    }
    

    用法:

    var topDirectory = @"D:\top directory";
    var file = "foo.txt";
    var theFile = FindFirstFile(topDirectory, file);
    

    它比内置功能更复杂,但您可以更好地控制何时返回。

    【讨论】:

      【解决方案3】:

      您所尝试的确实是解决方案。它不会遍历所有目录树,而是遍历其中的一部分;直到找到文件。

      或者-作为commented-,您可以直接获取FileInfo类(如果需要):

      FileInfo fileInfo = new DirectoryInfo(Directory.GetCurrentDirectory())
                                  .EnumerateFiles("myFile.ext", SearchOption.AllDirectories)
                                  .FirstOrDefault();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-06
        • 1970-01-01
        • 2011-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多