獲取 SharpSvn 執行 svn 操做的實時日誌

1 獲取 SharpSvn 操做日誌的方式

以前一篇隨筆(使用 SharpSvn 執行 svn 操做)講到能夠經過聲稱一個綁定到一個 SvnClient 對象的 SvnClientReport 對象。爲了說明方便,將對應的程序片斷再次寫在下面,html

using (SvnClient client = new SvnClient())
{
    StringBuilder strBuilder = new StringBuilder();
    SvnClientReporter reporter = new SvnClientReporter(client, strBuilder);
}

該程序片斷使用一個 StringBuilder 對象來聲稱 SvnClientReport 對象。這樣子,咱們只能等到執行 svn 操做以後才能從 StringBuilder 對象中獲取全部操做日誌。若是執行的 svn 操做比較耗時(例如 commit 上千個文件),咱們不可以實時地獲取 SharpSvn 執行 svn 操做的日誌,咱們會覺得程序卡住了。那麼,如何實時獲取 SharpSvn 操做的日誌?ide

2 實時獲取 SharpSvn 操做日誌

首先, 獲取 SharpSvn 執行 svn 操做日誌只能經過聲明 SvnClientReport 對象。這是咱們的出現點,那麼怎樣聲明一個實時獲取操做日誌的 SvnClientReport 對象?先看一下 SvnClientReport 類的構造函數(參考http://docs.sharpsvn.net/current/),svn

SvnClientReporter(SvnClient, TextWriter);函數

SvnClientReporter(SvnClient, StringBuilder);ui

SvnClientReporter(SvnClientArgs, TextWriter);spa

SvnClientReporter(SvnClientArgs, StringBuilder);.net

SvnClientReporter(SvnClient, StringBuilder, IFormatProvider);日誌

SvnClientReporter(SvnClientArgs, StringBuilder, IFormatProvider);code

經過 SvnClientReport 類的構造函數,咱們能夠看出咱們只能使用一個 StringBuilder 或者 TextWriter 對象來聲明一個 SvnClientReport 對象。上一節咱們已經看到經過 StringBuilder 對象是沒法實時獲取 SharpSvn 操做日誌的了,那咱們只能從 TextWriter 下手了。orm

經過http://msdn.microsoft.com/zh-cn/library/ywxh2328%28VS.80%29.aspx,咱們看到 TextWriter 是一個抽象類,那麼咱們是否是就能夠經過定義一個TextWriter 派生類來實現咱們實時獲取 SharpSvn 操做日誌呢?!

下面實現的 MyRealTimeTextWriter 類繼承了抽象類 TextWriter,實現了屬性 Encoding(必須實現),而且覆蓋實現了 void Write(string) 和void WriteLine(string value) 兩個方法,這兩個方法經過觸發 DataReceived事件告知外界其接收到的數據。

class MyRealTimeTextWriter : TextWriter
{
    //TextWriter派生類必須實現
    public Encoding Encoding
    {
        get { return Encoding.UTF8; }
    }
    
    //接收到數據,就觸發該事件
    public event Action<string> DataReceived;
    private void OnDataReceived(string value)
    {
        if (DataReceived != null)
        {
            DataReceived(value);
        }
    }
 
    public override void Write(string value)
    {
        OnDataReceived(value);
    }
    public override void WriteLine(string value)
    {
        OnDataReceived(value);
    }
}

有了 MyRealTimeTextWriter 類以後,咱們就可實現下面的程序來實時獲取 SharpSvn 操做的日誌。

using (SvnClient client = new SvnClient())
{
    MyRealTimeTextWriter realtimeTextWriter = new MyRealTimeTextWriter();
    realtimeTextWriter.DataReceived += new Action<string>(
        delegate (string value)
        {
            /* do on the sharpsvn operation logs */
        });
    SvnClientReporter reporter = new SvnClientReporter(client, realtimeTextWriter);
    /* do svn operations  */
}

上面程序經過一個 MyRealTimeTextWriter 對象來生成 SvnClientReport 對象。每當 SharpSvn 操做產生一條日誌信息時就會調用 MyRealTimeTextWriter 對象的 Write(string) 或 WriteLine(string) 方法,而這兩個方法當即觸發 DataReceived 事件告知外面有日誌生成了,因而便達到了實時獲取 SharpSvn 操做日誌的目的。

(done)

相關文章
相關標籤/搜索