特定日期获取文件计数但不获取文件名

时间:2015-05-18 07:30:35

标签: c# .net

我有这个功能,用于读取联系数十万个文件的目录,并获取特定日期的文件数。有没有办法根据提供的日期使用搜索/计数模式?

这很好用,但需要很长时间。有没有比这更好的了?

我正在使用VS 2008(我的客户端m / c。我无法升级框架或VS)

/public_html/public/

4 个答案:

答案 0 :(得分:1)

使用EnumerateFiles更有效率,例如使用LINQ:

int requestCount = filePath.EnumerateFiles()
    .Count(file => file.LastWriteTime < maxDate && file.LastWriteTime >= minDate);
  

EnumerateFilesGetFiles方法的区别如下:当你   使用EnumerateFiles,您可以开始枚举名称集合   在整个收藏品归还之前;当你使用GetFiles时,你   必须等待返回整个名称数组才能返回   访问数组。因此,当您使用许多文件时,   目录,EnumerateFiles可以更高效

但是,为什么要再次将DateTime转换为String然后再转换为ConvertToDateTime?而不是Convert.ToDateTime(DateTime.Now.ToShortDateString()),您只需要:DateTime.Today,所以:

DateTime minDate = DateTime.Today.AddDays(day);
DateTime maxDate = DateTime.Today;

如果您无法使用.NET4,则无法使用EnumerateFilesit'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分钟。