2010-10-07 112 views
2

之前,我有一個過程:C#程序 - 暫停或睡眠完成

Process pr = new Process(); 
pr.StartInfo.FileName = @"wput.exe"; 
pr.StartInfo.Arguments = @"C:\Downloads\ ftp://user:[email protected]/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上傳客戶端。

當我運行該過程並開始上傳時,應用程序凍結並且控制檯輸出直到結束時才顯示。我想通過使用線程可以解決第一個問題。

我想要做的就是開始上傳,每隔一段時間暫停一次,讀取已經生成的輸出(使用這些數據確定進度條等),然後重新開始。

我應該研究哪些類/方法?

回答

4

可以使用OutputDataReceived事件異步打印輸出。對此有幾項要求:

事件在StandardOutput的異步讀取操作期間啓用。要開始異步讀取操作,您必須重定向Process的StandardOutput流,將事件處理程序添加到OutputDataReceived事件,並調用BeginOutputReadLine。此後,OutputDataReceived事件在每次進程將行寫入重定向的StandardOutput流時發出信號,直到進程退出或調用CancelOutputRead。

這個工作的一個例子如下。這只是做一個長時間運行的操作,也有一些輸出(C:\ findstr /lipsn foo * - 在C驅動器上的任何文件中查找「foo」)。該StartBeginOutputReadLine調用是非阻塞的,所以你可以做其他的事情,而從你的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

最好的方法是使用支持FTP的庫,而不是依靠外部應用程序。如果您不需要來自外部應用程序的更多信息,並且不驗證其輸出,請繼續。否則更好地使用FTP客戶端庫。

可能是你想看到庫/單證:

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

+0

不幸的是,我必須使用wput.exe。 – nf313743 2010-10-07 09:14:30

+0

傷心,但克里斯的回答也很好! – Nayan 2010-10-07 11:27:34