正在使用c#中的wget进程下载图像的应用程序。 但在下载图像时,我提供的图像类型,即.jpeg或.png。通过wget命令。 如果在下载时我传递.jpeg并且如果.jpeg不存在,那么我想要捕获错误"找不到文件"通过流程类。但它没有发生。
我的代码如下:
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。那么如何以其他方式陷阱错误呢?
感谢任何帮助。
答案 0 :(得分: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);
}
}
如果您绝对想要回复记录的错误消息(标准输出或错误输出),请确保检查正确的字符串:如果日志显示ERROR 404: Not Found
,那么此message.Contains("file not found")
将永远不会是真的。这是我总是倾向于远离日志文件解析的原因。
请注意,不需要将错误消息写入标准错误流。错误消息也可以很好地出现在标准输出流中......