在C#中搜索子目录

5 .net c# performance file-io search

我有一个文件名列表,我想搜索一个目录及其所有子目录.这些目录每个包含大约200,000个文件.我的代码找到了该文件,但每个文件大约需要20分钟.有人可以提出更好的方法吗?

代码片段

String[] file_names = File.ReadAllLines(@"C:\file.txt");
foreach(string file_name in file_names) 
{
    string[] files = Directory.GetFiles(@"I:\pax\", file_name + ".txt",
                                        SearchOption.AllDirectories);
    foreach(string file in files)
    {
        System.IO.File.Copy(file, 
                            @"C:\" + 
                            textBox1.Text + @"\N\O\" + 
                            file_name + 
                            ".txt"
                            );
    }

}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 13

如果您在同一目录结构中搜索多个文件,则应该在该目录结构中找到一次所有文件,然后在内存中搜索它们.无需一次又一次地访问文件系统.

编辑:有一个优雅的方式,使用LINQ - 和不那么优雅的方式,没有.这是LINQ方式:

using System;
using System.IO;
using System.Linq;

class Test
{
    static void Main()
    {
        // This creates a lookup from filename to the set of 
        // directories containing that file
        var textFiles = 
            Directory.GetFiles("I:\\pax", "*.txt", SearchOption.AllDirectories)
                     .ToLookup(file => Path.GetFileName(file),
                               file => Path.GetDirectoryName(file));

        string[] fileNames = File.ReadAllLines(@"c:\file.txt");
        // Remove the quotes for your real code :)
        string targetDirectory = "C:\\" + "textBox1.Text" + @"\\N\\O\\";

        foreach (string fileName in fileNames)
        {
            string tmp = fileName + ".txt";
            foreach (string directory in textFiles[tmp])
            {
                string source = Path.Combine(directory, tmp);
                string target = Path.Combine(targetDirectory, tmp);
                File.Copy(source, target);                                       
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您需要非LINQ方式,请告诉我.在我这样做之前要检查一件事 - 这可以将多个文件复制到彼此的顶部.这真的是你想要做的吗?(想象一下,a.txt存在于多个地方,文件中有"a".)