我rsync
从我的应用程序内部启动。现在它工作正常,它打开一个控制台窗口,提示我输入密码,并在文件复制时显示文件进度。
public static int SyncFolder(string sourceFolder, string destFolder)
{
Process rsync = new Process();
rsync.StartInfo.FileName = Path.Combine(RsyncPath, "rsync.exe");
rsync.StartInfo.UseShellExecute = true;
rsync.StartInfo.Arguments = String.Join(" ", new[] { "-rltzh --progress --chmod=a=rw,Da+x", FileUtils.EncodeParameterArgument(sourceFolder), FileUtils.EncodeParameterArgument(destFolder) });
rsync.Start();
rsync.WaitForExit();
return rsync.ExitCode;
}
问题是我不想打开单独的控制台窗口。我想在某种类型的控件中显示文本进度,并从我的程序本身内部响应任何提示(例如输入密码)。
public int SyncFolder(string sourceFolder, string destFolder)
{
Process rsync = new Process();
rsync.StartInfo.FileName = Path.Combine(RsyncPath, "rsync.exe");
rsync.StartInfo.UseShellExecute = false;
rsync.StartInfo.RedirectStandardInput = true;
rsync.StartInfo.RedirectStandardOutput = true;
rsync.StartInfo.RedirectStandardError = true;
rsync.StartInfo.Arguments = String.Join(" ", new[] { "-rltzh --progress --chmod=a=rw,Da+x", FileUtils.EncodeParameterArgument(sourceFolder), FileUtils.EncodeParameterArgument(destFolder) });
rsync.ErrorDataReceived += rsync_ErrorDataReceived;
rsync.OutputDataReceived += rsync_OutputDataReceived;
rsync.Start();
BindToUiConrol(rsync.StandardInput);
rsync.WaitForExit();
return rsync.ExitCode;
}
private void rsync_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
//Magic!
}
private void rsync_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
//Even more Magic!
}
private void BindToUiConrol(StreamWriter standardInput)
{
if(this.InvokeRequired)
{
this.BeginInvoke(new Action<StreamWriter>(BindToUiConrol), standardInput);
return;
}
//Hook up events here so a single line text box dumps it's text in when you hit enter.
}
这就是我卡住的地方。如果我没有在同一行上不断更新的 %,我只会让它在新行进入时不断转储,但是我如何处理重新使用的行并放入新值?
我梦想的解决方案是在表单本身中嵌入一个控制台窗口,类似于HyperTerminal
旧版本的窗口,但我不知道如何在 .NET 中做到这一点。
这是一个显示问题的示例程序
public class Program
{
private static void Main(string[] args)
{
Console.Write("1");
Console.WriteLine();
Console.Write("2");
Console.CursorLeft = 0;
Console.Write("3");
Console.WriteLine();
Console.Write("4");
Console.WriteLine();
}
}
如何编写将显示的表单应用程序
1 3 4
在它运行进程之后的控件中。