获取 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)

相关文章
相关标签/搜索