以往在讀取文字檔時,會使用 File.ReadAllLines 方法,一次取得所有行。如下
static void Main(string[] args) { string[] lines = File.ReadAllLines("TextFile1.txt"); foreach (var line in lines) Console.WriteLine(line); }
相當簡單。但這樣的方法,遇到大型文字檔,例如100MB時,就很麻煩了。原因在ReadAllLines 時就會一次將所有的資料讀到 lines 中,可能造成記憶體不足。
在 c# 2.0 時,介紹了 yield 的語法。在 c#3.0 時,介紹了 LINQ 語法。於是上述的問題就可以解了。如下
static void Main(string[] args) { //string[] lines = File.ReadAllLines("TextFile1.txt"); // may need large memory var lines = ReadLines("TextFile1.txt"); //not consume large memory foreach (var line in lines) Console.WriteLine(line); } public static IEnumerable<string> ReadLines(string filePath) { using (StreamReader reader = new StreamReader(filePath)) { while (!reader.EndOfStream) yield return reader.ReadLine(); } }
上述的寫法很好。適合寫成常用的 framework! 因此,在 .net framework 4.0 中,已經將該段程式新增為 File.ReadLines
static void Main(string[] args) { //string[] lines = File.ReadAllLines("TextFile1.txt"); // may need large memory var lines = File.ReadLines("TextFile1.txt"); // not need large memory, new in .net framework 4.0 foreach (var line in lines) Console.WriteLine(line); }
類似新增的方法,有
File.WriteAllLines, File.AppendAllLines, Directory.EnumerateDirectories, Directory.EnumerateFiles, Directory.EnumerateFileSystemEntries, DirectoryInfo.EnumerateDirectories, DirectoryInfo.EnumerateFiles, DirectoryInfo.EnumerateFileSystemInfos
沒有留言:
張貼留言