首页 > 解决方案 > 在不影响整体应用程序性能的情况下删除多个超过 x 天的文件

问题描述

我有一个 Windows 应用程序,我想运行一个线程来删除超过 X 天的文件,一次删除 N 个文件。

所以我var files = DirectoryInfo.GetFiles()首先使用将所有文件信息加载到数组中。

然后我在数组上执行我的 Linq,如下所示:

var result = files.Where(f => f.LastWriteTime < DateTime.Now.AddDays(-2)).OrderBy(f.CreationDate).Take(200);

然后我遍历这个结果并一一删除。

我能够毫无问题地测试超过 20000 条记录,但现在我发现这可能在有超过 250000 条记录要删除的机器上运行。

所以问题是,这是清理这些文件的好方法吗?我应该期待内存或 CPU 高消耗等惊喜吗?还是我应该以另一种方式做到这一点?

标签: c#windows

解决方案


GetFiles方法将创建一个包含所有对象的内存数组FileInfo,这取决于可用内存,这可能是一个限制因素。另一种方法是流式传输FileInfo对象,这样就不必将所有项目都存储在内存中。

来自Microsoft Docs的引用:

使用 GetFiles 时,必须等待返回整个 FileInfo 对象数组,然后才能访问该数组。因此,当您处理许多文件和目录时,EnumerateFiles 会更有效。

DirectoryInfo.EnumerateFiles可以使用返回 anIEnumerable<System.IO.FileInfo>而不是 a的方法来流式传输路径System.IO.FileInfo[]

例子:

var directory = new DirectoryInfo(@"C:\ExampleDir");
var filesToDelete = directory.EnumerateFiles()
                    .Where(f => f.LastWriteTime < DateTime.Now.AddDays(-2));

foreach (var file in filesToDelete)
{
  Console.WriteLine(file.Name);
}

来源:Microsoft DirectoryInfo.EnumerateFiles 文档


推荐阅读