Чтение вывода из SVN в строку - PullRequest
3 голосов
/ 07 октября 2009

Хорошо, поэтому после моей идеи SSHing к серверу и использования клиента командной строки svn вместо удаленного рабочего стола (не большая идея tbh), я и мой босс решили, что было бы лучше, если бы мы могли обновить каждый проект с одной локальной веб-страницы (это только для нашего сервера разработки). Теперь я заставил это работать (один раз), но часто это не так.

Я использую следующий код:

<code>
        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 ]

2 голосов
/ 07 октября 2009

Вот некоторый код, взятый из одного из моих приложений - в основном это просто пример 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 голосов
/ 07 октября 2009

Не совсем ответ на ваш первоначальный вопрос, но другой подход может заключаться в использовании SharpSvn (http://sharpsvn.open.collab.net).. Предоставляя вам более прямой доступ к API, он может дать вам лучший контроль и результаты.

Я использовал его для мониторинга и обновления рабочих областей SVN, и он, похоже, сделал свою работу.

0 голосов
/ 07 октября 2009

Сначала я бы порекомендовал предложение Расти. Во-вторых, вы можете просмотреть этот код для рабочего примера захвата результатов процесса.

Если вы просто хотите использовать класс-оболочку по ссылке, вот что вам нужно:

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)
                );
    }
0 голосов
/ 07 октября 2009

Вам нужно будет периодически читать из стандартного канала вывода процесса во время его выполнения. Если вы этого не сделаете, тогда стандартный выходной буфер заполнится, и Windows приостановит процесс и подождет, пока он очистится, прежде чем продолжить. Конечно, ваш процесс находится в WaitForExit(), поэтому у вас тупик.

Это общий ответ, потому что я недостаточно знаком с примитивами управления процессами .NET, чтобы привести пример. Однако принцип такой же, как и в любой другой системе вывода по трубопроводу.

0 голосов
/ 07 октября 2009

Я думаю, вам нужно двигаться

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

после WaitToExit()

Вы также можете перенаправить стандартную ошибку в случае, если происходит что-то плохое, возможно, вы хотите знать об этом.

Также вы можете сократить свой код, выполнив string text= process.StandardOutput.ReadToEnd();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...