繁体   English   中英

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

经过一些复杂的处理后,我想知道是否除了标题外还添加了任何日志行。 显然,一种方法是每当我使用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);

请注意,这不是线程安全的。 我假设流将在任何时间点被单个线程访问。 您需要放置一些锁以使其成为线程安全的。

暂无
暂无

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

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