2014-11-01 3 views
1

Выполнение приложения загрузки изображений с использованием процесса wget в C#. Но при загрузке изображений я предоставляю тип изображения i.e.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 всегда имеет значение null. Итак, как я могу сделать ловушку, есть ли другой способ?

Любая помощь приветствуется.

ответ

1

wget (в версиях выше 1.12) действительно возвращает exitcode.

0 Проблем не возникло.
1 Общий код ошибки.
2 Ошибка анализа, например, при анализе параметров командной строки, «.wgetrc» или «.netrc» ...
3 Ошибка ввода-вывода файла.
4 Сбой сети.
5 Ошибка проверки SSL.
6 Ошибка аутентификации пользователя/пароля.
7 Ошибки протокола.
8 Сервер выдал сообщение об ошибке.

До 1.12 вы в беде:

В версиях Wget предыдущих 1,12, статус выхода WGET имел тенденцию быть бесполезным и противоречива. Рекурсивные загрузки практически всегда возвращают 0 (успех), независимо от любых возникающих проблем, а нерекурсивные выборки возвращают только статус, соответствующий последней попытке загрузки.

Выходной код процесса передается экземпляру процесса в свойстве ExitCode. Вы должны использовать это и вести журнал ошибок (ошибок) для удобства.

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") никогда не будет правдой. Это причина, по которой я всегда стараюсь держаться подальше от синтаксического анализа журнала.

Обратите внимание, что процессы не обязаны записывать ошибки в стандартный поток ошибок. Ошибки могут очень хорошо входить в стандартный выходной поток, а также ...

+0

: Я уже пробовал это уже. Но когда процесс прерывается, исключение «fie not found» не выполняется. ExitCode подходит только к нулю. Это не получается, почему он приближается к нулю? – Shikha

+0

все еще exitcode только для comin – Shikha

+0

Что конкретно находится в 'error.log'? – rene

Смежные вопросы