【问题标题】:Finding File from a Folder从文件夹中查找文件
【发布时间】:2015-01-08 14:34:35
【问题描述】:

目前我正在使用以下代码从文件夹中查找下一个文件。基本上我存储我读取的文件的最后修改日期和时间,在我完成处理该文件后,我需要转到下一个文件。但是我的代码目前需要大约 10 秒来使用下面的代码搜索下一个文件。

有人可以提出更快的方法吗?

DateTime lastfile = DateTime.Parse(System.IO.File.ReadAllText(@"lastFile.txt"));
string[] systemAFiles = System.IO.Directory.GetFiles("G:\\");

foreach (string files in systemAFiles)
{
    DateTime lastWriteTime = System.IO.File.GetLastWriteTime(files);
    if (lastWriteTime > lastfile) //produced after last file was read
    {
        readxml(files);
        break;
    }
}

【问题讨论】:

  • 要查看和改进现有的工作代码,您可能需要查看CodeReview.SE。虽然您的问题在 Stack Overflow 上并没有明确偏离主题,但更多的是关于 CodeReview 的主题。
  • 哪个部分耗时最长?
  • 我会使用System.IO.Directory.EnumerateFiles.Where(f=> lastWriteTime > System.IO.File.GetLastWriteTime(f)),这在这种情况下会更有效,但我怀疑它是否会产生很大的不同。你确定不是readxml 是慢的部分吗?
  • No No.. readxml 什么都不做.. 即使我给一个消息框,消息框也会在 10 秒后出现,而不是 readxml。因为我正在搜索的文件夹有大约 2000 到 2500 个文件。 :(
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。

标签: c# file directory


【解决方案1】:

您是否尝试缓存您的结果。您执行大部分工作一次,然后快速访问结果,例如字典。

所有文件的收集时间:

string[] systemAFiles = System.IO.Directory.GetFiles("G:\\");
Dictionary<DateTime, string> filesAndTimes = new Dictionary<DateTime, string>();

foreach (string file in systemAFiles)
{
    var time = System.IO.File.GetLastWriteTime(file);
    filesAndTimes[time] = file;
}

然后,您无需再次搜索所有文件,而是访问已收集的​​值:

var myFile = filesAndTimes.FirstOrDefault(item => item.Key > lastfile);

另外,如果您需要更新文件的时间,您只需在字典中添加一个条目。请注意,DateTime 是字典中的一个键。如果不是写入时间,可能会导致密钥冲突。但是两个文件没有两个相同的写入时间,所以在这里依赖DateTime 应该是安全的。

【讨论】:

  • 这看起来很有趣.. 但是我如何在运行时更新字典?我想每 2 小时我必须收集所有文件信息。
  • @gauravmajithia 这就是 DRapp 的答案可能发挥作用的地方。您可以拥有一个监视和缓存文件和更改的类。然后当你检查它时,你就会知道你应该有一个最新的缓存。
  • 我同意 psubsee2003。字典更新不是开箱即用的。您将不得不添加一个机制来监视它。我想说的是,在进行初始搜索后,字典更新将快速高效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-05
  • 2023-03-24
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多