c# - 在不影响整体应用程序性能的情况下删除多个超过 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 高消耗等惊喜吗?还是我应该以另一种方式做到这一点?
解决方案
该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);
}
推荐阅读
- swift - 如何使用 dispatchQueues 创建引用循环?
- sql - 使用 Oracle SQL 窗口函数以部分数量满足多个需求的 SQL 查询
- angular - 在 app.module.ts 中初始化 firestore 时如何禁用 firestore 持久性?
- c++ - 表达式 std::enable_if 中的 type* 是什么
- c# - 在 PDF 文档中找不到 ColorSpace 对象的位置
- pki - PKI 中的信任锚证书
- python - 有没有办法在python中“堆叠”一个列表?
- prolog - 在 Prolog 中导出相同谓词的模块
- excel - 从左到右对多行进行排序
- image - 图像 uri 未按预期工作 - React Native