从C#代码运行.exe时遇到问题

时间:2011-08-07 02:01:57

标签: c#-4.0 imagemagick shellexecute

我有这个应该运行shell命令的函数。 这就是我所说的:

RunCommand("C:\\source\\in\\DSC00749.jpg -gravity Center -crop 100x100+0+0 -write C:\\source\\out\\DSC00749.jpg");

private static string RunCommand(string cmd)
    {
        const int ERROR_FILE_NOT_FOUND = 2;
        const int ERROR_ACCESS_DENIED = 5;

        string strErrMsg = "OK";

        try
        {
            ProcessStartInfo procInfo = new ProcessStartInfo("convert.exe");

            procInfo.CreateNoWindow = true;
            procInfo.UseShellExecute = true;

            procInfo.Arguments = cmd;
            Process.Start(procInfo);
        }
        catch (Win32Exception e)
        {
            if (e.NativeErrorCode == ERROR_FILE_NOT_FOUND)
            {
                strErrMsg = "File not found exception";
            }
            else if (e.NativeErrorCode == ERROR_ACCESS_DENIED)
            {
                strErrMsg = "Access Denied Exception";
            }
        }

        return strErrMsg;
    }

如果我在命令shell中运行它,它可以工作:

convert.exe C:\\source\\in\DSC00749.jpg -gravity Center -crop 100x100+0+0-write C:\\source\\out\\DSC00749.jpg

如果我在调试中运行更多或直接运行它,它就不会创建图像。

我的代码出了什么问题?我是以正确的方式做到的吗?

3 个答案:

答案 0 :(得分:1)

你错过了反斜杠:C:\\source\\in\\DSC00749.jpg

为了避免进一步的错误,如果字符串包含反斜杠,请在字符串前加@。示例:@"My Path\My Filename"

此外,您似乎只是通过处理某些类型的异常来“吞噬”某些Win32Exception。您应该在catch块的末尾包含throw;以重新抛出您未处理的Win32Exception。它可能是一个不同的Win32Exception,既不报告“找不到文件”也不报告“拒绝访问”。

答案 1 :(得分:1)

请记住,这是与您的代码异步运行的,因此Process.Start调用将立即返回。如果您之后致电WaitForExit()会怎样?

此外,我不确定您为何使用mvc-3标记此内容,但如果您是从网络应用程序运行此功能,则需要确保您有权这样做。

答案 2 :(得分:1)

您是否拥有convert.exe的完整路径?

尝试一下,看看它是否有效,因为你没有得到任何例外。