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

时间:2013-09-03 07:17:10

标签: c# string file

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

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”字符串的最后一个文件?

谢谢!

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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:如果第一个文件匹配,则无需全部检索它们。

答案 2 :(得分: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();