如何在目录中搜索以某内容开头的文件,然后获取最近修改的文件

How to search a directory for files that begin with something then get the one that was modified most recently

我想做的是search/scan一个以某物开头的多个文件的目录,然后获取最近修改的文件。例如,我想在目录 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);
}

基本上,我怎样才能使代码搜索 'apple'、'pear' 等而不只是苹果?我不知道你是否可以修改上面的代码来做到这一点,或者你是否必须完全改变它。几个小时以来,我一直在努力解决这个问题,但做不到。

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

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 对象。

您可以遍历列表

   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;
       }
   }

如我的评论所述,您不能将 DirectoryInfo.GetFiles 用于 FileInfo 的 return 列表如此不同的模式。仅支持一种模式。

如其他所示,您可以准备一个模式列表,然后在每个模式上循环调用 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 将为空。使用该变量之前必须进行检查。