簡體   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