将svn的输出读入字符串

时间:2009-10-07 17:56:34

标签: c# svn process

好的,所以在我想到SSH服务器并使用svn命令行客户端而不是远程桌面(不是很多想法)之后,我和我的老板已经决定如果我们可以更新每个来自单个本地网页的项目(这仅适用于我们的开发服务器)。 现在,我确实让它工作(一次),但通常不会。

我使用以下代码:


        ProcessStartInfo start = new ProcessStartInfo("C:\Program Files (x86)\CollabNet\Subversion Client\svn.exe", "update " + UpdatePath);
        start.RedirectStandardOutput = true;
        start.UseShellExecute = false;
        start.ErrorDialog = false;
        start.CreateNoWindow = true;
        start.WindowStyle = ProcessWindowStyle.Hidden;
        Process process = Process.Start(start);
        StreamReader output = process.StandardOutput;
        string text = output.ReadToEnd();
        process.WaitForExit();
        Response.Write(text + "<br />" + UpdatePath);

理论上,这应该收集来自svn应用程序的输出,并将其写入页面,但它不会(除非在极少数情况下它实际更新,但是当我特别需要输出时!)

有人能发现问题吗?

5 个答案:

答案 0 :(得分:2)

对原始问题的回答不完全,但使用SharpSvn(http://sharpsvn.open.collab.net)可能采用不同的方法。通过为您提供更直接的API访问权限,它可以为您提供更好的控制和结果。

我用它来监视和更新svn工作区域,似乎完成了工作。

答案 1 :(得分:2)

以下是我的一个应用程序中的一些代码 - 它基本上只是MSDN示例。 (http://msdn.microsoft.com/en-us/library/system.diagnostics.process.outputdatareceived.aspx

private void SvnOutputHandler(object sendingProcess,
                                      DataReceivedEventArgs outLine)
{
    Process p = sendingProcess as Process;

    // Save the output lines here
}


private void RunSVNCommand()
{
    ProcessStartInfo psi = new ProcessStartInfo("svn.exe",
                                                string.Format("update \"{0}\" {1}", parm1, parm2));

    psi.UseShellExecute = false;
    psi.CreateNoWindow = true;

    // Redirect the standard output of the sort command.  
    // This stream is read asynchronously using an event handler.
    psi.RedirectStandardOutput = true;
    psi.RedirectStandardError = true;

    Process p = new Process();

    // Set our event handler to asynchronously read the sort output.
    p.OutputDataReceived += SvnOutputHandler;
    p.ErrorDataReceived += SvnOutputHandler;
    p.StartInfo = psi;

    p.Start();

    p.BeginOutputReadLine();
    p.BeginErrorReadLine();

    p.WaitForExit()
}

答案 2 :(得分:0)

我认为你需要搬家

StreamReader output = process.StandardOutput;
string text = output.ReadToEnd();
WaitToExit()

之后

您可能还想重定向标准错误,以防出现不良情况,您可能想知道它。

您也可以通过string text= process.StandardOutput.ReadToEnd();

来缩短代码

答案 3 :(得分:0)

在运行过程中,您需要定期读取进程的标准输出管道。如果不这样做,那么标准输出缓冲区将填满,Windows将暂停该过程并等到它清除后再继续。当然,您的流程位于WaitForExit(),因此您遇到了僵局。

这是一个通用的答案,因为我不熟悉.NET进程管理原语来举例。但是,原理与任何其他管道输出系统相同。

答案 4 :(得分:0)

首先,我会建议Rusty的建议。其次,您可以查看this code以获取捕获流程输出的工作示例。

如果您只想使用链接中的包装类,这就是您所需要的:

using CSharpTest.Net.Processes;
    static void Update(string sourcePath, Action<string> output)
    {
        ProcessRunner run = new ProcessRunner("svn.exe", "update", "{0}");
        run.OutputReceived +=
            delegate(Object o, ProcessOutputEventArgs e) { output(e.Data); };
        int exitCode = run.RunFormatArgs(sourcePath);
        if (exitCode != 0)
            throw new ApplicationException(
                String.Format("SVN.exe returned {0}.", exitCode)
                );
    }