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

时间:2017-12-14 22:40:21

标签: c# search directory fileinfo

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

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'等而不仅仅是苹果?我不知道你是否可以修改上面的代码来做到这一点,或者你是否必须完全改变它。我一直试图弄清楚这几个小时,但不能这样做。

3 个答案:

答案 0 :(得分:1)

正如我的评论中所解释的那样,你不能使用 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 将为null。使用该变量之前的检查是强制性的。

答案 1 :(得分:0)

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

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();

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

答案 2 :(得分:0)

您可以遍历列表

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