我有一个很大的目录,里面有大约500k的jpg文件,我想归档所有早于某个日期的文件。目前,该脚本需要数小时才能运行。
这与GoGrid的存储服务器非常糟糕的性能有很大关系,但同时,我相信有一种更有效的方法来完成我正在做的事情。
下面是我的代码:
var dirInfo = new DirectoryInfo(PathToSource);
var fileInfo = dirInfo.GetFiles("*.*");
var filesToArchive = fileInfo.Where(f =>
f.LastWriteTime.Date < StartThresholdInDays.Days().Ago().Date
&& f.LastWriteTime.Date >= StopThresholdInDays.Days().Ago().Date
);
foreach (var file in filesToArchive)
{
file.CopyTo(PathToTarget+file.Name);
}
Days().Ago()只是语法上的糖。
发布于 2009-11-05 07:30:24
虽然.NET 4.0提供了惰性Directory.EnumerateFiles
,但你现在可以在.NET 3.5上做到这一点:
发布于 2009-11-05 06:58:49
我认为您可以改进的唯一部分是dirInfo.GetFiles("*.*")
。在.NET 3.5和更早的版本中,它返回一个包含所有文件名的数组,这需要时间来构建并使用大量内存。在.NET 4.0中,有一个新的Directory.EnumerateFiles
方法,它返回一个IEnumerable<string>
,并在从磁盘读取结果时立即获取结果。这可能会稍微提高性能,但不要期待奇迹...
发布于 2009-11-05 07:09:52
您应该考虑使用第三方实用程序为您执行复制。像robocopy这样的东西可能会显着提高处理速度。另请参阅https://serverfault.com/questions/54881/quickest-way-of-moving-a-large-number-of-files
https://stackoverflow.com/questions/1677226
复制相似问题