【问题标题】:Get first x items from FileInfo从 FileInfo 获取前 x 个项目
【发布时间】:2020-05-31 22:03:08
【问题描述】:

我在 C# 中有一个 FileInfo,如下所示:

        DirectoryInfo dir = new DirectoryInfo(folder);
        FileInfo[] files = dir.GetFiles("Car*", SearchOption.TopDirectoryOnly);

我希望能够选择files 中文件的第一个x 项目,比如30,并从files 中删除其余的项目。如果不从0 循环到29,我该怎么做?

【问题讨论】:

  • 从文件中删除其余部分您想从files集合或目录中删除它们(物理抑制)?
  • 很确定 OP 表示从名为files 的数组中删除,因为标题是“获取前x 个项目”
  • 是的,我的意思是从数组中删除。

标签: c# fileinfo


【解决方案1】:

不要使用GetFiles,而是使用EnumerateFiles加上TakeToArray

DirectoryInfo dir = new DirectoryInfo(folder);
FileInfo[] files = dir.EnumerateFiles("Car*", SearchOption.TopDirectoryOnly).Take(30).ToArray();

这将创建一个数组,其中最多包含目录中的前 30 个项目。这样做的好处是,在非常大的目录上,它最多只返回 30 个项目GetFiles 将返回目录 first 中的每个文件,如果文件很多,这可能需要一些时间。另一方面,EnumerateFiles 返回一个 IEnumerable<FileInfo>,它允许您“流式传输”结果并应用 LINQ 运算符将它们收集到数组或列表中。

注意:您需要确保文件顶部有适当的 using 指令:

using System.Linq;

【讨论】:

  • 有趣的是,在我之前的一项工作中,后台进程会“挂起”大约十分钟,然后突然启动。随着时间的推移,它必须花费两倍的时间。事实证明,我们正在处理的目录中有数十万个文件,查询底层 win32 API 和构造数组都需要很长时间。从GetFiles 切换到EnumerateFiles 极大地加快了工作速度,实际上让它最终赶上并处理和清除文件夹中的所有文件
  • 我认为可以添加类似.OrderBy(o => o.FullName).Take(30).OrderByDescending(o => o.LastWriteTime).Take(30) 的内容?您是否有任何经验/想法会如何影响您提到的轶事案例中的性能?
  • 那种的情况下,你可能会遇到同样的问题。 OrderBy 必须首先将所有条目加载到内存中。也就是说,我相当确定操作系统按字母顺序返回,因此我们不需要按文件名排序,但我们需要最后写入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-15
相关资源
最近更新 更多