首页 > 学院 > 开发设计 > 正文

获取SharpSvn执行svn操作的实时日志

2019-11-14 13:57:49
字体:
来源:转载
供稿:网友

1 获取 SharpSvn 操作日志的方式

之前一篇随笔(使用 SharpSvn 执行 svn 操作)讲到可以通过声称一个绑定到一个 SvnClient 对象的 SvnClientReport 对象。为了说明方便,将对应的程序片段再次写在下面,

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

该程序片段使用一个 StringBuilder 对象来声称 SvnClientReport 对象。这样子,我们只能等到执行 svn 操作之后才能从 StringBuilder 对象中获取所有操作日志。如果执行的 svn 操作比较耗时(例如 commit 上千个文件),我们不能够实时地获取 SharpSvn 执行 svn 操作的日志,我们会以为程序卡住了。那么,如何实时获取 SharpSvn 操作的日志?

2 实时获取 SharpSvn 操作日志

首先, 获取 SharpSvn 执行 svn 操作日志只能通过声明 SvnClientReport 对象。这是我们的出现点,那么怎样声明一个实时获取操作日志的 SvnClientReport 对象?先看一下 SvnClientReport 类的构造函数(参考http://docs.sharpsvn.net/current/),

SvnClientReporter(SvnClient, TextWriter);

SvnClientReporter(SvnClient, StringBuilder);

SvnClientReporter(SvnClientArgs, TextWriter);

SvnClientReporter(SvnClientArgs, StringBuilder);

SvnClientReporter(SvnClient, StringBuilder, IFormatPRovider);

SvnClientReporter(SvnClientArgs, StringBuilder, IFormatProvider);

通过 SvnClientReport 类的构造函数,我们可以看出我们只能使用一个 StringBuilder 或者 TextWriter 对象来声明一个 SvnClientReport 对象。上一节我们已经看到通过 StringBuilder 对象是无法实时获取 SharpSvn 操作日志的了,那我们只能从 TextWriter 下手了。

通过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)


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表