我有一个过程:
Process pr = new Process();
pr.StartInfo.FileName = @"wput.exe";
pr.StartInfo.Arguments = @"C:\Downloads\ ftp://user:dvm@172.29.200.158/Transfer/Updates/";
pr.StartInfo.RedirectStandardOutput = true;
pr.StartInfo.UseShellExecute = false;
pr.StartInfo.
pr.Start();
string output = pr.StandardOutput.ReadToEnd();
Console.WriteLine("Output:");
Console.WriteLine(output);
Wput是一个ftp上传客户端。
当我运行该过程并开始上传时,应用程序冻结,控制台输出直到结束才会显示。我猜第一个问题可以通过使用Thread来解决。
我想要做的是开始上传,让它经常停顿,读取已经生成的任何输出(使用此数据做进度条等),然后重新开始。
我应该研究哪些类别/方法?
答案 0 :(得分:4)
您可以使用OutputDataReceived
事件异步打印输出。这有一些要求:
在StandardOutput上的异步读取操作期间启用该事件。要启动异步读取操作,必须重定向Process的StandardOutput流,将事件处理程序添加到OutputDataReceived事件,并调用BeginOutputReadLine。此后,每次进程将一行写入重定向的StandardOutput流时,OutputDataReceived事件都会发出信号,直到进程退出或调用CancelOutputRead。
这项工作的一个例子如下。它只是做一个长时间运行的操作,也有一些输出(findstr /lipsn foo *
在C:\上 - 在C盘上的任何文件中查找“foo”)。 Start
和BeginOutputReadLine
调用是非阻塞的,因此您可以在FTP应用程序的控制台输出进入时执行其他操作。
如果您想停止从控制台阅读,请使用CancelOutputRead
/ CancelErrorRead
方法。此外,在下面的示例中,我使用单个事件处理程序处理标准输出和错误输出,但您可以将它们分开并在需要时以不同方式处理它们。
using System;
using System.Diagnostics;
namespace AsyncConsoleRead
{
class Program
{
static void Main(string[] args)
{
Process p = new Process();
p.StartInfo.FileName = "findstr.exe";
p.StartInfo.Arguments = "/lipsn foo *";
p.StartInfo.WorkingDirectory = "C:\\";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.OutputDataReceived += new DataReceivedEventHandler(OnDataReceived);
p.ErrorDataReceived += new DataReceivedEventHandler(OnDataReceived);
p.Start();
p.BeginOutputReadLine();
p.WaitForExit();
}
static void OnDataReceived(object sender, DataReceivedEventArgs e)
{
Console.WriteLine(e.Data);
}
}
}
答案 1 :(得分:1)
最好的方法是使用支持FTP的库,而不是依赖外部应用程序。如果您不需要外部应用程序提供太多信息且未验证其输出,那么请继续。否则最好使用FTP客户端库。
可能你想看libs / documentations:
http://msdn.microsoft.com/en-us/library/ms229711.aspx
http://www.codeproject.com/KB/IP/ftplib.aspx
http://www.c-sharpcorner.com/uploadfile/danglass/ftpclient12062005053849am/ftpclient.aspx