2016-07-25 59 views
0

我必須讀取包含數百萬條記錄的文本文件。在閱讀文件時,我必須實現類似「Tracker」的功能,它會將最後一次讀取的LineNumber寫入日誌文件。我不希望這個日誌文件打開並且寫入操作會影響我的應用程序性能。任何人都可以建議我如何實現它? P.S.我正在使用yield來讀取這個大文件,並且我有這樣的多個文件。我想停止閱讀操作,如果文件有一些無效的記錄...雖然這個閱讀操作正在進行,但我想以某種方式讓最終用戶知道,到目前爲止它已經閱讀了如此之多的行文件閱讀正在進行中。寫入文件讀取操作

using (StreamReader reader = new StreamReader(_fileNameAndPath)) 
       { 
        while (reader.EndOfStream == false) 
        { 
         string data = reader.ReadLine(); 

         _fileLineNumber = _fileLineNumber + 1; 
    //this line number should go to tracker file Logger.Trace(_fileLineNumber) 

         //............ 
        } 
       } 

Logger類:

public static class Logger 
{  
     ..... 
     public static void Trace(string message) 
     { 
      FileStream fileStream = new FileStream(logFilePath, FileMode.Append); 
      StreamWriter streamWriter = new StreamWriter(fileStream); 
      streamWriter.WriteLine(message); 
     } 

} 
+0

只要保持流爲整個應用程序或讀取上下文打開。 AKA沒有靜態記錄器 - 注入它 –

+3

這真的是你的'Logger.Trace()'實現嗎?因爲您沒有關閉文件流... –

+0

您需要記錄程序結束時讀取的最後一行的編號,還是需要記錄您閱讀的每一行? – falx

回答

0

則可以將文件流存儲爲一個類級別的私有字段,打開它你進入你的循環之前,然後將其關閉退出循環之後。

或者更好的是,在Logger實施IDisposable和包裝一個using語句中的循環,所有的清理工作將自動發生:

public class Logger : IDisposable 
{ 
    private FileStream fileStream; 
    private StreamWriter streamWriter; 

    public void Trace(string message) 
    { 
     streamWriter.WriteLine(message); 
    } 

    public Logger(string logFilePath) 
    { 
     fileStream = new FileStream(logFilePath, FileMode.Append); 
     streamWriter = new StreamWriter(fileStream); 
    } 

    public void Dispose() 
    { 
     streamWriter.Dispose(); 
     fileStream.Dispose(); 
    } 
} 

這裏是你將如何你的代碼中使用它:

var logFilePath = ""; // replace this with however you get your log path. 

using (var logger = new Logger(logFilePath)) 
{ 
    while (reader.EndOfStream == false) 
    { 
     string data = reader.ReadLine(); 
     _fileLineNumber= _fileLineNumber + 1; 
     logger.Trace(_fileLineNumber); 
    } 
} 
0

很顯然,我不知道你真正想要做,但我想,以保存記錄的東西一個最好的辦法是寫你的整個過程後的文件。因此,您可以創建一個數組數組,並在該過程完成後存儲該數組。

var readLines = new List<number>(); 

using (StreamReader reader = new StreamReader(_fileNameAndPath)) 
{ 
    while (reader.EndOfStream == false) 
    { 
     string data = reader.ReadLine(); 
     readLines.Add(_fileLineNumber); 

     _fileLineNumber = _fileLineNumber + 1; 
    } 
} 

Logger.Trace(readLines.ToString()); 
+0

對不起,感到困惑......請閱讀其他評論 – bansi