我有一个文件名列表,我想搜索一个目录及其所有子目录。这些目录每个包含大约 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"
);
}
}
如果您在同一目录结构中搜索多个文件,您应该找到all该目录结构中的文件一次,然后在内存中搜索它们。无需一次又一次地访问文件系统。
编辑:有一种优雅的方法可以做到这一点,使用 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);
}
}
}
}
如果您需要非 LINQ 方式,请告诉我。不过,在这样做之前需要检查一件事 - 这可能会复制多个文件。就是它really你想做什么? (想象一下a.txt
存在于多个地方,并且“a”在文件中。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)