我想要做的是搜索/扫描目录以查找以某些内容开头的多个文件,然后获取最近修改过的文件。例如,我想在目录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'等而不仅仅是苹果?我不知道你是否可以修改上面的代码来做到这一点,或者你是否必须完全改变它。我一直试图弄清楚这几个小时,但不能这样做。
答案 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;
}
}