0

我知道如何获取最后一个文件,代码如下:

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();

我的问题是:如何获取最后一个包含特定字符串的文件?或者换句话说,我怎样才能得到最后一个不包含“这是临时文件”字符串的文件?

谢谢!

4

3 回答 3

3

你可以这样做:

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);
于 2013-09-03T07:21:20.323 回答
3

从我的头顶:

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:如果第一个匹配,则无需全部检索它们。

于 2013-09-03T07:25:51.577 回答
1

一开始我会做一些更简单的事情:

    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();
于 2013-09-03T07:35:09.753 回答