Неверное перенаправление стандартного вывода ошибок / ошибок из ncftpput.exe
Я пытаюсь получить выходной поток из ncftpput.exe и быть в состоянии управлять потоком асинхронно. ncftpput.exe не печатает свой поток построчно, вместо этого он просто обновляет ту же строку новой информацией (это может быть актуально). Это работает с перебоями - иногда я получаю информацию обратно, иногда нет.
По сути, есть ли способ, которым я могу получить поток, который часто обновляет свою линию, чтобы быть перенаправленным более безопасным и регулярным способом?
Вот то, что я получил до сих пор (я аннотировал это, избавляясь от ненужной посторонней информации, но это суть):
class Program
{
static int main()
{
internal Process m_Tool { get; set; }
internal ProcessStartInfo m_StartInfo { get; set; }
internal static string m_StandardData { get; set; }
internal static string m_ErrorData { get; set; }
m_Tool = new Process();
m_StartInfo = new ProcessStartInfo();
m_StartInfo.FileName = @"C:\utils\ncftpput.exe";
m_StartInfo.UseShellExecute = false;
m_StartInfo.RedirectStandardOutput = true;
m_StartInfo.RedirectStandardError = true;
m_StandardData = "";
m_ErrorData = "";
m_StartInfo.Arguments = /* Various starting args */
m_Tool.StartInfo = m_StartInfo;
m_Tool.Start();
string standardLine;
string errorLine;
try
{
m_Tool.OutputDataReceived += ProcessStandardDataHandler;
m_Tool.ErrorDataReceived += ProcessErrorDataHandler;
m_Tool.BeginErrorReadLine();
m_Tool.BeginOutputReadLine();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
while (!m_Tool.HasExited)
{
System.Threading.Thread.Sleep(5000);
standardLine = m_StandardData;
errorLine = m_ErrorData;
}
}
private static void ProcessErrorDataHandler(object sendingProcess, DataReceivedEventArgs outLine)
{
if (!String.IsNullOrEmpty(outLine.Data))
{
// Add the text to the collected output.
m_ErrorData = outLine.Data.ToString();
m_DataReceived = true;
}
}
private static void ProcessStandardDataHandler(object sendingProcess, DataReceivedEventArgs outLine)
{
if (!String.IsNullOrEmpty(outLine.Data))
{
// Add the text to the collected output.
m_StandardData = outLine.Data.ToString();
}
}
}
Заранее спасибо!!
1 ответ
В конце я обнаружил, что из-за того, как ncftpput.exe печатался на консоли, было невозможно получить достаточную информацию из перенаправленного вывода. Поэтому я просто решил написать свое собственное FTP-приложение и использовать его! Это более простое приложение, чем ncftpput.exe, но оно делает то, что мне нужно. Я использовал стандартную библиотеку.NET, ничего особенного.