简体   繁体   English

写入文件读取操作

[英]write to file read operations

I have to read text file that has millions of records. 我必须阅读具有数百万条记录的文本文件。 while reading file I have to implement something like "Tracker" which will write last read LineNumber to log file. 在读取文件时,我必须实现“ Tracker”之类的东西,它将最后读取的LineNumber写入日志文件。 I don't want this log file open and write operation affect my application performance. 我不希望此日志文件打开和写入操作影响我的应用程序性能。 can anyone suggest me how to implement it? 谁能建议我如何实施? PS I am using yield to read this big file, and I have multiple files like that. PS:我正在使用yield读取此大文件,并且我有多个这样的文件。 I want to stop reading operation if file has some invalid record...While this read operation is going on I want to somehow want to let end users know that so far it has read so and so number of line - file read is in progress. 如果文件有一些无效的记录,我想停止读取操作...正在进行此读取操作时,我想以某种方式让最终用户知道到目前为止它已经读取了这么多行-正在读取文件。

    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 class : 记录器类:

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

}

You could store your file stream as a class-level private field, open it before you enter your loop, then close it after you exit the loop. 您可以将文件流存储为类级别的私有字段,在进入循环之前将其打开,然后在退出循环后将其关闭。

Or better yet, implement IDisposable on Logger , and wrap your loop inside a using statement, and all the cleanup will take place automatically: 或者更好的是,在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();
    }
}

here is how you would use it within the code you have: 在您拥有的代码中使用它的方式如下:

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

Clearly, I don't know what you're really trying to make but I suppose a best way to save that logging stuff is to write the file after your entire process. 显然,我不知道您实际上要做什么,但是我想保存日志记录内容的最佳方法是在整个过程之后写入文件。 So, you can create an array of number and store that array once the process is done. 因此,您可以创建一个数字数组,并在处理完成后存储该数组。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM