如何获取不包含特定字符串的最后一个文件

本文关键字:字符串 最后一个 文件 包含特 何获取 获取 | 更新日期: 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();