我必须读取包含数百万条记录的文本文件。在读取文件时,我必须实现类似"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());