C#通过进程调用curl命令,可以形成成功,但是curl输出C#应用无法获取解决,导致curl执行成功与否无法知道。
解决方法:
可以C#调用批处理,批处理再调用curl,curl加上参数–stderr,将输出定向到文件,在通过 type命令将输出文件显示,C#就可以获取curl输出结果。
C#代码:
private int ExeUpLoadFile(TextBox resulttxtbox)
{
int ret = 0;
string workingFolder = System.IO.Directory.GetCurrentDirectory();
string curlcmd = workingFolder + “\plugin\curl” + “upload.bat”;
string cmdarg = this.UserNameTextBox.Text + " " + this.PasswordTextBox.Text + " " +
this.DeviceIPTextBox.Text + " " + this.UpdateFileTextBox.Text;
//创建进程对象
Process tmpprocess = new Process();
tmpprocess.StartInfo.FileName = curlcmd;//设定需要执行的命令
tmpprocess.StartInfo.Arguments = cmdarg;
tmpprocess.StartInfo.UseShellExecute = false;//不使用系统外壳程序启动
tmpprocess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
tmpprocess.StartInfo.RedirectStandardInput = true;//不重定向输入
tmpprocess.StartInfo.RedirectStandardOutput = true; //不重定向输出
tmpprocess.StartInfo.RedirectStandardError = false;
tmpprocess.StartInfo.CreateNoWindow = true;//不创建窗口resulttxtbox.AppendText(" 开始上传升级包...\r\n");//开始进程
if (tmpprocess.Start())
{
string log = tmpprocess.StandardOutput.ReadLine();
while (log != null)
{
if (resulttxtbox != null)
{
resulttxtbox.AppendText(log + “\r\n”);
}if (log.IndexOf(“curl:”) > -1)
{
ret = -1;
}
log = tmpprocess.StandardOutput.ReadLine();
}
tmpprocess.Close();
tmpprocess = null;
}if (ret == 0)
{
resulttxtbox.AppendText(" 上传升级包完成.\r\n");
}
else
{
resulttxtbox.AppendText(" 上传升级包失败.\r\n");
}return ret;
}
对应批处理:
@echo off
rem *************************************************
rem
rem 上传文件
rem
rem *************************************************
rem 当前工作路径
set workdir=%~dp0rem 获取网关登录用户
set sgwuser=%1rem 获取网关登录密码
set sgwpasswd=%2rem 获取网关地址
set sgwaddr=%3rem 上传开发包
%workdir%curl.exe -u %sgwuser%:%sgwpasswd% -T %4 ftp://%sgwaddr%/update.tar.gz --stderr %workdir%result.txt
type %workdir%result.txt
del /F/Q %workdir%result.txt