我正在尝试从也具有特定前缀的目录中获取最新文件。如果我没有在getfiles()之后将搜索字符串重载,我能够成功使用代码,但如果我使用它,我会得到一个例外说明:
未处理的类型' System.InvalidOperationException'具有 发生在System.Core.dll
中
1982-09-20
答案 0 :(得分:2)
嗯,你需要向自己提几个问题。
如果没有匹配的文件怎么办?您当前的实施是否有效?没有。它会崩溃。为什么?因为.First()运算符。
正如您所提到的,您希望查找具有特定前缀的文件,因此请在您的前缀中添加通配符*
。查找以某些前缀开头的所有文件。
FileInfo mostrecentlog = (from f in logDirectory.GetFiles("your_pattern*") orderby
f.LastWriteTime descending select f).FirstOrDefault();
现在检查mostrecentlog
是否为空,如果它不为空,则它将包含与您的最新文件匹配的特定前缀。
答案 1 :(得分:1)
使用方法语法可能会使这个读取更容易,同时使用Where()
子句来指定您要搜索的内容:
// You must specify the path you want to search ({your-path}) when using the GetFiles()
// method.
var mostRecentFile = logDirectory.GetFiles("{your-path}")
.Where(f => f.Name.StartsWith("Receive"))
.OrderByDescending(f => f.LastWriteTime)
.FirstOrDefault();
同样,您可以在Directory.GetFiles()
方法中指定搜索模式作为第二个参数:
// You can supply a path to search and a search string that includes wildcards
// to search for files within the specified directory
var mostRecentFile = logDirectory.GetFiles("{your-path}","Receive*")
.OrderByDescending(f => f.LastWriteTime)
.FirstOrDefault();
重要的是要记住FirstOrDefault()
将返回找到的第一个元素,如果没有找到任何项目,则返回null
,因此您需要执行检查以确保在继续之前找到了一些内容:
// Get your most recent file
var mostRecentFile = DoTheThingAbove();
if(mostRecentFile != null)
{
// A file was found, do your thing.
}
答案 2 :(得分:0)
只需使用FirstOrDefault()
代替First()
FileInfo mostrecentlog = (from f in logDirectory.GetFiles("Receive") orderby f.LastWriteTime descending select f).FirstOrDefault()