我有一个包含大约 500k jpg 文件的巨大目录,我想存档所有早于特定日期的文件。目前,该脚本需要数小时才能运行。
这与 GoGrid 存储服务器糟糕的性能有很大关系,但与此同时,我确信有一种更有效的 Ram/Cpu 明智方式来完成我正在做的事情。
这是我的代码:
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() 只是语法糖。
最佳答案
我认为您唯一可以改进的部分是 dirInfo.GetFiles("*.*")
.在 .NET 3.5 及更早版本中,它返回一个包含所有文件名的数组,这需要时间来构建并使用大量 RAM。在 .NET 4.0 中,有一个新的 Directory.EnumerateFiles
返回 IEnumerable<string>
的方法相反,并在从磁盘读取结果时立即获取结果。这可以稍微提高性能,但不要指望奇迹......
关于c# - C# 中的高性能文件复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1677226/