我必须阅读有数百万条记录的文本文件。在阅读文件时,我必须实现类似" Tracker"它会将最后读取的LineNumber写入日志文件。我不希望这个日志文件打开,写操作会影响我的应用程序性能。任何人都可以建议我如何实现它? 附:我使用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);
}
}
答案 0 :(得分:0)
您可以将文件流存储为类级私有字段,在进入循环之前将其打开,然后在退出循环后将其关闭。
或者更好的是,在IDisposable
上实现Logger
,并将循环包装在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);
}
}
答案 1 :(得分: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());