2016-07-25 84 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