Не удается перенаправить вывод cmd.exe в программу C#

Я сделал программу C#, которая вводит ftp-команды в cmd.exe, она считывает вывод и отображает его на консоли. Проблема в том, что он зависает при чтении вывода Console.WriteLine(srFTP.ReadToEnd()); Отладчик ошибок не показывает. Он просто застревает. Я попытался поместить console.writelines в каждую строку, и оказалось, что он застрял в этой точке. Помощь?

    public static void CheckKVSConnect()
    {
        Process KVSFTP = new Process();
        KVSFTP.StartInfo.FileName = "cmd.exe";
        KVSFTP.StartInfo.Arguments = "disable";
        KVSFTP.StartInfo.UseShellExecute = false;
        KVSFTP.StartInfo.RedirectStandardOutput = true;
        KVSFTP.StartInfo.RedirectStandardInput = true;
        KVSFTP.StartInfo.RedirectStandardError = true;
        KVSFTP.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        KVSFTP.Start();
        StreamWriter swFTP = KVSFTP.StandardInput;
        swFTP.WriteLine("ftp");
        swFTP.WriteLine("open aaaaaa.org");
        swFTP.WriteLine("username");
        swFTP.WriteLine("password");
        StreamReader srFTP = KVSFTP.StandardOutput;
        Console.WriteLine(srFTP.ReadToEnd());
        Console.WriteLine("DONE");
    }

person Matty    schedule 05.07.2014    source источник
comment
Вы не читаете stderr, поэтому любая ошибка заблокирует вашу программу.   -  person Hans Passant    schedule 05.07.2014


Ответы (1)


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

Вместо этого вам придется использовать ReadLine и проанализировать строки, чтобы выяснить, когда вы дошли до точки, когда вам нужно отправить больше ввода в приложение. (Или используйте управляемый код для выполнения ваших FTP-операций вместо того, чтобы обращаться к интерактивному приложению командной строки.)

person Joe White    schedule 05.07.2014