如何获取不包含特定字符串的最后一个文件
本文关键字:字符串 最后一个 文件 包含特 何获取 获取 | 更新日期: 2023-09-27 18:29:55
我知道如何获得最后一个文件,这是代码:
string pattern = "Log*.xml";
string directory = set. Path;
var dirInfo = new DirectoryInfo(directory);
var file = (from f in dirInfo.GetFiles(pattern) orderby f.LastWriteTime descending select f).First();
我的问题是:如何获取不包含特定字符串的最后一个文件?或者换句话说,我如何才能得到最后一个不包含"This is temporally file"字符串的文件?
谢谢!
从我的头顶:
dirInfo.EnumerateFiles(pattern)
.OrderByDescending(f => f.LastWriteTime)
.Where(f => DoesntContain(f, myText))
.FirstOrDefault()
现在,您可以自由地使DoesntContain
变得任意复杂或简单。使用File.ReadAllText
或类似于的东西
bool DoesntContain(FileInfo fileInfo, string text) {
using (StreamReader r = fileInfo.OpenText()) {
var contents = r.ReadToEnd();
return !contents.Contains(text);
}
}
您可以将该方法编写为扩展,以获得更自然的语法,如fi.DoesntContain(...)
此外,如果目录可以包含许多文件,我建议使用EnumerateFiles
而不是GetFiles
:如果第一个文件匹配,则无需检索所有文件。
您可以这样做:
string pattern = "Log*.xml";
var dirInfo = new DirectoryInfo(directory);
var filesThatContains = dirInfo.GetFiles(pattern).
Where(f=>File.ReadAllLines(Path.Combine(directory, f.Name),
Encofing.UTF8).IndexOf(SEARCH_STRING)>=0);
一开始我会做一些更简单的事情:
public static string[] FileNamesExcluding(string path, string pattern, string textToExclude)
{
// Put all txt files in root directory into array.
string[] allFilesMatchingPattern = Directory.GetFiles(path, pattern); // <-- Case-insensitive
return allFilesMatchingPattern.SkipWhile(a => a.Contains(textToExclude)).ToArray();
}
要调用此方法,您可以执行以下操作:
FileNamesExcluding(@"C:'", "*.sys", "config").Last();