【问题标题】:How to search a directory for files that begin with something then get the one that was modified most recently如何在目录中搜索以某些内容开头的文件,然后获取最近修改的文件
【发布时间】:2018-05-29 03:00:20
【问题描述】:

我想要做的是搜索/扫描一个目录以查找以某些内容开头的多个文件,然后获取最近一次修改的文件。例如,我想在 Prefetch 目录中搜索以“apple”、“pear”和“orange”开头的文件。这些文件可能不存在,但如果它们存在,并且说有以 apple 开头的文件和以 pear 开头的文件,在所有这些文件中,我想获得最近修改的文件。下面的代码允许我这样做,但只搜索一件事。

DirectoryInfo prefetch = new DirectoryInfo("c:\\Windows\\Prefetch");
FileInfo[] apple = prefetch.GetFiles("apple*");
if (apple.Length == 0)
   // Do something
else
{
   double lastused = DateTime.Now.Subtract(
                     apple.OrderByDescending(x => x.LastWriteTime)
                          .FirstOrDefault().LastWriteTime).TotalMinutes;
   int final = Convert.ToInt32(lastused);
}

基本上,我怎样才能使代码搜索“苹果”、“梨”等而不是苹果?我不知道您是否可以修改上面的代码来做到这一点,或者您是否必须完全更改它。我一直试图解决这个问题几个小时,但无法做到。

【问题讨论】:

  • 只需使用适当的模式调用 GetFiles 三次,将结果存储在三个不同的数组中,然后将它们添加到一个列表中。现在您可以通过降序应用顺序并获取列表的第一个元素。不清楚你最后想用那个计算做什么
  • 我可以看到这将如何工作并且可能会解决我的问题,但是我将如何存储它们并将它们添加到列表中?
  • 声明一个 List 然后使用 AddRange 将这三组文件添加到同一个列表中。现在,该列表中的 OrderByDescending 和 FirstOrDefault 将为您提供该集合中最近写入的文件。
  • 我得到了这个工作,非常感谢。无法将其标记为正确,因为它不是答案,但谢谢;p
  • 好吧,添加了一个答案以进一步简化模式上的循环。

标签: c# search directory fileinfo


【解决方案1】:

您可以创建一组与前缀匹配的文件,然后检查这些文件的日期,例如(未测试):

List<string> files=new List<string>();
foreach(var str in prefixes)
  files.AddRange(dirInfo.GetFiles(str));

return (from d in (from name in files select File.GetLastAccessTime(name)) orderby d descending).FirstOrDefault();

prefixes 是搜索模式列表,dirInfo 是 DirectoryInfo 对象。

【讨论】:

  • DirectoryInfo.GetFiles 返回 FileInfos,那么您不需要最后一行,只需要 OrderByDescending 和 FirstOrDefault
【解决方案2】:

你可以遍历一个列表

   List<string> patterns = new List<string> { "apple*", "pear*", "orange*" };
   DirectoryInfo prefetch = new DirectoryInfo("c:\\Windows\\Prefetch");         

   foreach (var pattern in patterns) {
       FileInfo[] files = prefetch.GetFiles(pattern);
       var lastAccessed = files.OrderByDescending(x => x.LastAccessTime).FirstOrDefault();
       if (lastAccessed != null) {
           var minutes = DateTime.Now.Subtract(lastAccessed.LastAccessTime).TotalMinutes;
       }
   }

【讨论】:

    【解决方案3】:

    正如我的 cmets 中所解释的,您不能使用 DirectoryInfo.GetFiles 来返回具有如此不同模式的 FileInfo 列表。仅支持一种模式。

    正如其他已经展示的那样,您可以准备一个模式列表,然后在每个模式上循环调用 GetFiles。

    但是,我会向您展示相同的方法,但只需在 Linq 中使用一行代码即可。

    List<string> patterns = new List<string> { "apple*", "pear*", "orange*" };
    DirectoryInfo prefetch = new DirectoryInfo(@"c:\Windows\Prefetch");  
    
    var result = patterns.SelectMany(x => prefetch.GetFiles(x))
                         .OrderByDescending(k => k.LastWriteTime)
                         .FirstOrDefault();
    

    现在,result 是具有最新更新的 FileInfo。当然,如果没有文件匹配这三种模式,那么 result 将为空。在使用该变量之前进行检查是强制性的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      相关资源
      最近更新 更多