如何在目录中搜索以某内容开头的文件,然后获取最近修改的文件
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 将为空。使用该变量之前必须进行检查。
我想做的是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 将为空。使用该变量之前必须进行检查。