C#读取文件内容和查找字符串

时间:2009-04-27 04:17:50

标签: c# file

我是C#的新手。 我需要在某个目录下打开一堆代码文件,并获取包含一些匹配字符串的特定行。 这是一个简单的问题,我可以使用流阅读器逐个打开文件,然后逐行解析它们。 我想知道是否有更有效的方法来做同样的事情。就像我的印象是Stream阅读器和逐行阅读将是繁重的操作。

4 个答案:

答案 0 :(得分:5)

关于如何获取文件的行,已经有一些好的帖子,所以我想我会添加一些关于效率的内容。有几个人提到了File.ReadAllLines()方法。从效率的角度来看,这种方法存在问题,因为它会一次将整个文件读入内存。此外,它使用数组作为存储,需要连续的内存。如果文件足够大,这将导致问题。

读取文件的更有效方法是重复使用StreamReader.ReadLine方法。它将一次返回一行,你只需要在内存中保留你关心的行。将其转换为延迟评估迭代器也相对容易。

public static IEnumerable<string> ReadLinesEnumerable(string path) {
  using ( var reader = new StreamReader(path) ) {
    var line = reader.ReadLine();
    while ( line != null ) {
      yield return line;
      line = reader.ReadLine();
    }
  }
}

就LINQ而言。您可以使用LINQ同时匹配ReadAllLines和ReadLinesEnumerable方法,因为它们都返回可枚举的数据类型。例如

var query = from line in ReadLinesEnumerable(@"c:\some\path\file.txt")
            where Regex.IsMatch(line, @"^(\d)+.*$")
            select line;

答案 1 :(得分:1)

File.ReadAllLines()将为您提供一个包含文件中每一行的数组。如果您能够在文件中途停止阅读,这可能会更多。如果没有,它可能会节省你一些时间在IO(较少的个人IO调用,这只是一个猜测)。

如果您真的很担心,请使用分析器或编写基准。否则,使用最容易阅读的方法。

答案 2 :(得分:0)

如果您需要检查文件的全部内容,那么您将需要阅读每一行。 ReadLine()和任何方法一样好。

您可以使用StreamReader.ReadToEnd()

一次阅读整个文件内容

答案 3 :(得分:0)

ReadCoEnd()方法在LoC(代码行)方面确实很有效,但是如果你关心性能,你可能要小心它,因为它基本上将整个文件内容加载到内存中(串)。如果文件大小很大,你肯定会受到性能的影响。