c#:从 MemoryStream/StreamWriter 获取行数
c#: Getting line count from MemoryStream/StreamWriter
我使用以下代码写入日志文件:
Encoding enc = Encoding.GetEncoding(932);
MemoryStream msLog = new MemoryStream();
StreamWriter swLog = new StreamWriter(msLog, enc);
swLog.WriteLine("Line Number,Error,Additional Information"); //log header
经过一些复杂的处理,我想知道是否添加了除header之外的任何日志行。显然,一种方法是在我使用 swLog.WriteLine() 时将一些布尔变量设置为 true,但是由于代码又长又复杂,我想避免这种方法。如何轻松检查内存流的行数?
如您所述,还有其他更好的方法可以做到这一点。但是,这里是对您问题的直接回答:
首先,确保 StreamWriter
已经像这样将数据刷新到流中:
swLog.Flush();
然后,可以用下面的方法检测MemoryStream
是否多于一行:
private bool HasMoreThanNumberOfLines(Stream stream, Encoding enc, int number_of_lines)
{
long current_position = stream.Position;
stream.Position = 0;
try
{
using(StreamReader sr = new StreamReader(stream, enc, true, 1024, true))
{
for (int i = 0; i < number_of_lines + 1 ; i++)
{
string line = sr.ReadLine();
if (line == null)
return false;
}
}
return true;
}
finally
{
stream.Position = current_position;
}
}
请注意,我正在使用 StreamReader
的特殊构造函数,以确保它在处理时不会关闭底层流 (stream
)。
另请注意此方法如何保存流的当前位置,然后在执行其逻辑后恢复它,以便 StreamWriter
继续正常工作。
你可以这样使用这个方法:
var has_another_line = HasMoreThanNumberOfLines(msLog, enc, 1);
请注意,这不是线程安全的。我假设流将在任何时间点由单个线程访问。您需要加一些锁以使其成为线程安全的。
我使用以下代码写入日志文件:
Encoding enc = Encoding.GetEncoding(932);
MemoryStream msLog = new MemoryStream();
StreamWriter swLog = new StreamWriter(msLog, enc);
swLog.WriteLine("Line Number,Error,Additional Information"); //log header
经过一些复杂的处理,我想知道是否添加了除header之外的任何日志行。显然,一种方法是在我使用 swLog.WriteLine() 时将一些布尔变量设置为 true,但是由于代码又长又复杂,我想避免这种方法。如何轻松检查内存流的行数?
如您所述,还有其他更好的方法可以做到这一点。但是,这里是对您问题的直接回答:
首先,确保 StreamWriter
已经像这样将数据刷新到流中:
swLog.Flush();
然后,可以用下面的方法检测MemoryStream
是否多于一行:
private bool HasMoreThanNumberOfLines(Stream stream, Encoding enc, int number_of_lines)
{
long current_position = stream.Position;
stream.Position = 0;
try
{
using(StreamReader sr = new StreamReader(stream, enc, true, 1024, true))
{
for (int i = 0; i < number_of_lines + 1 ; i++)
{
string line = sr.ReadLine();
if (line == null)
return false;
}
}
return true;
}
finally
{
stream.Position = current_position;
}
}
请注意,我正在使用 StreamReader
的特殊构造函数,以确保它在处理时不会关闭底层流 (stream
)。
另请注意此方法如何保存流的当前位置,然后在执行其逻辑后恢复它,以便 StreamWriter
继续正常工作。
你可以这样使用这个方法:
var has_another_line = HasMoreThanNumberOfLines(msLog, enc, 1);
请注意,这不是线程安全的。我假设流将在任何时间点由单个线程访问。您需要加一些锁以使其成为线程安全的。