写入到文件读取操作



我必须读取包含数百万条记录的文本文件。在读取文件时,我必须实现类似"Tracker"的东西,它将把最后读取的行号写入日志文件。我不希望此日志文件打开和写入操作影响我的应用程序性能。有人能建议我如何实施吗?附言:我使用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 )
                       //............
                     }
                }

记录器类别:

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); 
      }
}

您可以将文件流存储为类级私有字段,在进入循环之前打开它,然后在退出循环后关闭它。

或者更好的是,在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);
    }
}

很明显,我不知道你真正想做什么,但我认为保存日志的最好方法是在整个过程之后编写文件。因此,您可以创建一个数字数组,并在处理完成后存储该数组。

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());

相关内容

  • 没有找到相关文章

最新更新