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".)
| 归档时间: |
|
| 查看次数: |
3350 次 |
| 最近记录: |