我有这个功能,用于读取联系数十万个文件的目录,并获取特定日期的文件数。有没有办法根据提供的日期使用搜索/计数模式?
这很好用,但需要很长时间。有没有比这更好的了?
我正在使用VS 2008(我的客户端m / c。我无法升级框架或VS)
/public_html/public/
答案 0 :(得分:1)
使用EnumerateFiles
更有效率,例如使用LINQ:
int requestCount = filePath.EnumerateFiles()
.Count(file => file.LastWriteTime < maxDate && file.LastWriteTime >= minDate);
EnumerateFiles
和GetFiles
方法的区别如下:当你 使用EnumerateFiles
,您可以开始枚举名称集合 在整个收藏品归还之前;当你使用GetFiles
时,你 必须等待返回整个名称数组才能返回 访问数组。因此,当您使用许多文件时, 目录,EnumerateFiles可以更高效。
但是,为什么要再次将DateTime
转换为String
然后再转换为ConvertToDateTime
?而不是Convert.ToDateTime(DateTime.Now.ToShortDateString())
,您只需要:DateTime.Today
,所以:
DateTime minDate = DateTime.Today.AddDays(day);
DateTime maxDate = DateTime.Today;
如果您无法使用.NET4,则无法使用EnumerateFiles
和it's not easy to get the same lazy load behaviour。您仍然可以使用LINQ方法来提高可读性。
答案 1 :(得分:0)
如果您有3.5 .NET框架约束,请尝试使用
public static int GetFileCount(DirectoryInfo filePath)
{
int requestCount = 0;
DirectoryInfo info = new DirectoryInfo(filePath);
DateTime minDate = Convert.ToDateTime(DateTime.Now.AddDays(day).ToShortDateString());
DateTime maxDate = Convert.ToDateTime(DateTime.Now.ToShortDateString());
DateTime lastWriteTime = DateTime.MinValue;
requestCount = info.GetFiles().Select(x => (x.LastWriteTime >= minDate && x.LastWriteTime <= maxDate)).Count();
return requestCount;
}
答案 2 :(得分:0)
我建议你将文件阵列分解为2/4/8列表(取决于你拥有的处理器数量,即双处理器 - 2,四处理器 - 4,八位处理器 - 8)。然后生成2/4/8个线程并为每个线程提供它自己的列表来处理,然后当所有线程完成它们的单独处理时,将结果组合并显示给最终用户。
注意:此解决方案将加快您的解决方案,但它不会快2x / 4x / 8x,因为此解决方案可能听起来像。其他变量中存在磁盘IO会影响执行时间。
答案 3 :(得分:0)
之前我遇到过类似的问题,并且在某些情况下能够将处理时间减少10倍。我所做的是在这里使用FindFile方法:https://code.google.com/p/csharptest-net/source/browse/src/Library/IO/FindFile.cs
此外,在系统上禁用8.3文件名。相关链接:https://support.microsoft.com/en-us/kb/130694
启用8.3文件名可能会影响某些情况下的性能。我上面链接的Microsoft知识库文章描述了这个问题。除了禁用8.3文件名之外,您还必须修改系统上的现有文件。我做的是将它们全部移动到临时目录,然后返回。禁用8.3文件名会阻止新文件获得分配给它的8.3文件名,但现有文件仍然可以使用它。
执行上述步骤后,我注意到了性能的提升。我有超过500k文件的某些文件夹需要将近2个小时来迭代和处理,但有了这个,我花了大约5分钟。