GetFiles/GetDirectories和EnumerateDirectories/EnumerateFiles对
本文关键字:EnumerateFiles EnumerateDirectories GetDirectories GetFiles | 更新日期: 2023-09-27 18:27:41
我有一个映射到网络驱动器号W的文件服务器。它有732个主文件夹、子文件夹和许多文件。我已将一个虚拟目录映射到此驱动器,并将其命名为"Documents"。
现在我想检查只找到包含"最终"的文件夹需要多少时间。我创建了一个控制台应用程序,而不是一个网络应用程序,并在下面写了代码,这给了我非常慢的结果,这是不希望的。请在下面找到代码
DateTime startdatetime = DateTime.Now;
var dirs = from dir in
Directory.EnumerateDirectories("W:''", "*Final*", SearchOption.AllDirectories)
select dir;
foreach (var dir in dirs)
{
Console.WriteLine(dir);
}
DateTime EndDate = DateTime.Now;
TimeSpan t = EndDate - startdatetime;
Console.WriteLine(t.Minutes);
Console.ReadLine();
这只给了我第一次运行5分钟和第二次运行6分钟内的文件夹而不是文件名。我过去只获取文件夹的旧代码是
DateTime startdatetime = DateTime.Now;
string[] dirs =
Directory.GetDirectories("W:''", "*Final*", SearchOption.AllDirectories);
foreach (var dir in dirs)
{
Console.WriteLine(dir);
}
DateTime EndDate = DateTime.Now;
TimeSpan t = EndDate - startdatetime;
Console.WriteLine(t.Minutes);
Console.ReadLine();
上面的代码在6-7分钟内给了我文件夹列表。上面代码中的组合文件和文件夹在12分钟内给出了结果。这是对网络性能的巨大惩罚。
你们知道怎么减少这个罚分上限吗?我被困在这里了。
我觉得迭代整个目录和文件非常昂贵。试着找出你为什么需要它。为什么不获取一个目录并在其中搜索文件呢?我的意思是,试着与你的技术团队和企业主一起做一些分析,这样每一个都是现实的。
我唯一能想到的是对每个循环使用Parallel,而不是普通的循环,这样你就可以利用你的CPU了。但这将降低成本,但不会大幅降低。
我相信他们的请求一点也不奇怪,他们只是想搜索他们的资产。当它与您的文档文件夹及其文件路径同步时,您可以有一个小数据库,并且您的查询结果可以在表上,而不是在IO文件上。