2014-11-01 137 views
1

正在使用c#中的wget進程下載圖像的應用程序。 但在下載圖像時,我提供的圖像類型即.jpeg或.png。通過wget命令。 如果在下載時傳遞.jpeg,如果.jpeg不存在,那麼我想通過進程類來捕獲錯誤「找不到文件」。但它沒有發生。如何捕獲wget進程的錯誤?

我的代碼是下面:

class TrapProcessError 
{ 
    private Process process = new Process(); 

    public TrapProcessError() 
    { 
    } 

    public void Start() 
    { 
     string args= "-r -c -np --retry-connrefused --tries=0 "url containing image folder" -P C:\\Images --cut-dirs=2 -nH -A jpeg -o C:\\Images\\error.log"; 
     string filename= "path of wget\\wget.exe"; 
     process.StartInfo.FileName = filename; 
     process.StartInfo.Arguments = args; 
     process.StartInfo.UseShellExecute = false; 
     process.StartInfo.RedirectStandardError = true; 
     process.StartInfo.RedirectStandardOutput = true; 
     process.ErrorDataReceived += this.ProcessErrorData; 
     process.OutputDataReceived += this.ProcessOutputData; 
     process.Start();  
     process.BeginErrorReadLine(); 
     process.BeginOutputReadLine(); 
     process.WaitForExit(); 
    } 

    private void ProcessErrorData(object sender, DataReceivedEventArgs e) 
    { 
     string message = e.Data;      
     if (message.Contains("file not found")) 
     { 
      Console.WriteLine("Error :" +message); 
      process.Close();    
     }  
    } 

    private void ProcessOutputData(object sender, DataReceivedEventArgs e) 
    { 
     string message = e.Data; 
     Console.WriteLine("Output :" +message); 
    } 

    public static void Main(string[] args) 
    { 
     TrapProcessError trapProcessError= new TrapProcessError(); 
     trapProcessError.Start(); 
    } 
} 

在上面的代碼中,如果JPEG不erroe.log未來然後送「未找到文件」。但是通過流程類不會陷阱錯誤,即在ProcessErrorData中,e.Data始終爲空。那麼我怎麼能捕獲錯誤還有其他方法嗎?

任何幫助表示讚賞。

回答

1

wget(在版本高於1.12的版本中)確實會返回可靠的exitcode

0沒有發生問題。
1通用錯誤代碼。
2解析錯誤 - 例如,解析命令行選項時,'.wgetrc'或'.netrc'...
3文件I/O錯誤。
4網絡故障。
5 SSL驗證失敗。
6用戶名/密碼認證失敗。
7協議錯誤。
8服務器發出錯誤響應。

此前1.12你就麻煩了:

在早於1.12 Wget的版本,Wget的的退出狀態往往是無益的,不一致的。無論遇到什麼問題,遞歸下載實際上都會返回0(成功),而非遞歸提取僅返回與最近嘗試下載相對應的狀態。

該進程的exitcode返回到ExitCode屬性中的Process實例。你應該利用這一點,並保持(錯誤)日誌記錄方便。

public void Start() 
{ 
    string args= "-r -c -np --retry-connrefused --tries=0 "url containing image folder" -P C:\\Images --cut-dirs=2 -nH -A jpeg -o C:\\Images\\error.log"; 
    string filename= "path of wget\\wget.exe"; 
    process.StartInfo.FileName = filename; 
    process.StartInfo.Arguments = args; 
    process.StartInfo.UseShellExecute = false; 
    process.StartInfo.RedirectStandardError = true; 
    process.StartInfo.RedirectStandardOutput = true; 
    process.ErrorDataReceived += this.ProcessErrorData; 
    process.OutputDataReceived += this.ProcessOutputData; 
    process.Start();  
    process.BeginErrorReadLine(); 
    process.BeginOutputReadLine(); 
    process.WaitForExit(); 
    if (process.ExitCode > 0) 
    { 
     // do what you need to do in case of an Error 
     Console.WriteLine("Error occured:{0}", process.ExitCode); 
    } 
} 

如果你絕對要來了記錄的錯誤消息進行響應(無論是standardoutout或ERROROUTPUT),請務必檢查正確的字符串:如果日誌顯示ERROR 404: Not Found那麼這message.Contains("file not found")永遠不會爲真。這是我總是傾向於遠離日誌文件解析的原因。

請注意,不需要進程將errormessage寫入標準錯誤流。錯誤消息可以很好地進入標準輸出流...

+0

:我已經試過這個了,但是當進程終止因爲「fie not found」異常。 ExitCode僅僅是零。這並沒有得到,爲什麼它是零? – Shikha 2014-11-01 10:23:43

+0

仍然exitcode只comin零 – Shikha 2014-11-01 10:28:20

+0

什麼是'error.log'完全? – rene 2014-11-01 10:29:12