Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Piping in a file on the command-line using System.Diagnostics.Process

I'm trying to run a command-line program and piping in a file. The command works fine on the command-line, but I can't seem to get it to work with the Process object in C#. Here's the command I'm issuing:

"C:\Servers\CollabNet Subversion Server\svnadmin" load C:\Repositories\TestLoad < C:\Temp\test.dump

This function works fine with all the other commands that I pass to it, except for the command above:

public static bool ExecuteSvnCommand( string command, string arguments, out string result, out string errors )
{
    bool retval = false;
    string output = string.Empty;
    string errorLines = string.Empty;
    Process svnCommand = null;
    var psi = new ProcessStartInfo( command );

    psi.RedirectStandardOutput = true;
    psi.RedirectStandardError = true;
    psi.WindowStyle = ProcessWindowStyle.Hidden;
    psi.UseShellExecute = false;
    psi.CreateNoWindow = true;

    try
    {
        Process.Start( psi );
        psi.Arguments = arguments;
        svnCommand = Process.Start( psi );

        StreamReader myOutput = svnCommand.StandardOutput;
        StreamReader myErrors = svnCommand.StandardError;
        svnCommand.WaitForExit();

        if ( svnCommand.HasExited )
        {
            output = myOutput.ReadToEnd();
            errorLines = myErrors.ReadToEnd();
        }

        // Check for errors
        if ( errorLines.Trim().Length == 0 )
        {
            retval = true;
        }
    }
    catch ( Exception ex )
    {
        string msg = ex.Message;
        errorLines += Environment.NewLine + msg;
    }
    finally
    {
        if (svnCommand != null)
        {
            svnCommand.Close();
        }
    }

    result = output;
        errors = errorLines;

    return retval;
}

I've tried several different combinations of this function, but I can't get this to work. I keep getting a "The system cannot find the file specified" message. I've been at this for about a week now, and I think I need a few set of eyes to see what I'm doing wrong.

like image 966
Hector Sosa Jr Avatar asked May 12 '09 01:05

Hector Sosa Jr


1 Answers

Both Mark and Luke gave me the right direction to go. I couldn't use either answer because I had to do this so that it could run with Mono in Linux. So I ended up writing to the StandardInput as suggested. Here is the code that works:

public static bool ExecuteSvnCommandWithFileInput( string command, string arguments, string filePath, out string result, out string errors )
{
    bool retval = false;
    string output = string.Empty;
    string errorLines = string.Empty;
    Process svnCommand = null;
    var psi = new ProcessStartInfo( command );

    psi.RedirectStandardInput = true;
    psi.RedirectStandardOutput = true;
    psi.RedirectStandardError = true;
    psi.WindowStyle = ProcessWindowStyle.Hidden;
    psi.UseShellExecute = false;
    psi.CreateNoWindow = true;

    try
    {
        Process.Start( psi );
        psi.Arguments = arguments;
        svnCommand = Process.Start( psi );

        var file = new FileInfo(filePath);
        StreamReader reader = file.OpenText();
        string fileContents = reader.ReadToEnd();
        reader.Close();

        StreamWriter myWriter = svnCommand.StandardInput;
        StreamReader myOutput = svnCommand.StandardOutput;
        StreamReader myErrors = svnCommand.StandardError;

        myWriter.AutoFlush = true;
        myWriter.Write(fileContents);
        myWriter.Close();

        output = myOutput.ReadToEnd();
        errorLines = myErrors.ReadToEnd();

        // Check for errors
        if ( errorLines.Trim().Length == 0 )
        {
            retval = true;
        }
    }
    catch ( Exception ex )
    {
        string msg = ex.Message;
        errorLines += Environment.NewLine + msg;
    }
    finally
    {
        if (svnCommand != null)
        {
            svnCommand.Close();
        }
    }

    result = output;
    errors = errorLines;

    return retval;
}
like image 179
Hector Sosa Jr Avatar answered Oct 09 '22 02:10

Hector Sosa Jr