如何知道Process.Start()是否成功?

时间:2011-04-21 22:56:04

标签: c# .net excel process

我尝试了两种不同的方法来启动流程。

第一个

定义被定义为Start方法的参数:

System.Diagnostics.Process.Start("excel", string.Format("\"{0}\"", ExcelFileBox.Text.ToString()));

我的想法:

这个开始很好,但我不知道如何从中得到反馈。

第二个

我开始研究ProcessStartInfo,因为我想知道Excel是否成功启动 - 例如,虽然它很可能存在于用户的机器上,但是我无法保证这对我来说是愚蠢的。如果没有,则向用户表明它已成功启动。

System.Diagnostics.ProcessStartInfo startinfo = new System.Diagnostics.ProcessStartInfo
            {
                FileName = "excel",
                Arguments = string.Format("\"{0}\"", ExcelFileBox.Text.ToString()),
                ErrorDialog = true,
                UseShellExecute = false,
                WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
            };

            try
            {
                System.Diagnostics.Process.Start(startinfo);
            }
            catch (Exception err)
            {
                Console.WriteLine(err.Message);
            }

我的想法:

这给出了错误:“系统找不到指定的文件”,但不清楚它是否意味着Excel应用程序或我的文件。无论如何,虽然我很欣赏错误信息的能力,但我现在不应该接受。

如何知道这是否成功的想法,建议和想法?

解决

我将启动流程的第一种方式放入try-catch中,它的工作非常精彩。

4 个答案:

答案 0 :(得分:18)

Process.Start()上的MSDN页面声明此方法具有布尔类型的重载,其中返回值表示:

  

如果启动了流程资源,则为true;   如果没有新的进程资源,则返回false   开始(例如,如果存在   过程被重用)。

此外,它可以抛出三个例外:

  • 出现InvalidOperationException

Process组件的StartInfo中没有指定文件名。

- 或 -

当ProcessStartInfo.RedirectStandardInput,ProcessStartInfo.RedirectStandardOutput或ProcessStartInfo.RedirectStandardError为true时,StartInfo属性的ProcessStartInfo.UseShellExecute成员为true。

  • Win32Exception

打开相关文件时出错。

  • 的ObjectDisposedException

过程对象已经被处理掉了。


要使用Process.Start()的重载(这是方法的唯一非静态重载),您需要使用ProcessStartInfo对象创建Process类的实例。

以下是一个例子:

ProcessStartInfo processStartInfo = new ProcessStartInfo("EXCEL.EXE");

Process process = new Process();
process.StartInfo = processStartInfo;
if (!process.Start())
{
    // That didn't work
}

尽管如此,考虑到这仍然可以抛出你,可能更好的只是在一个静态.Start()方法调用周围包裹一个catch。


鉴于此,似乎很清楚对Process.Start()的调用是否有效,您可以从返回值为0(或抛出异常)中确定这一点。

一旦你的进程启动,你就可以对事物进行大量控制,使用Process类的属性(例如HasExited)可以检查进程的状态。

简而言之 - 如果用户的机器上没有excel,Process.Start()将抛出异常。

答案 1 :(得分:5)

您可以在Process.ExitCode属性中查看0成功)值。

答案 2 :(得分:4)

Process.Start()还返回一个布尔值,让您知道它是否已获取现有流程或是否已启动新流程。

此外,您可以检查流程的ProcessId以确保它已启动/仍在运行。类似的东西:

bool started = False;
Process p = new Process();
p.StartInfo = YourStartInfo;
started = p.Start();

try {
  int procId = p.Id;
}
catch(InvalidOperationException){
  started = False
}
catch(Exception ex) {
  started = False
}

答案 3 :(得分:0)

为准确确定进程是否真正启动,我尝试查找进程ID,如果找到进程ID,则如果找不到进程ID,它将继续执行,它将进入catch并打印调试语句。 / p>

            try
            {
                 bool pathExists = File.Exists(module.ExecutionPath);
                 if (pathExists)
                 {
                     ProcessStartInfo startArgs = new ProcessStartInfo();
                     startArgs.FileName = "C:\Windows\System32\notepad.exe";
                     startArgs.Arguments = null;

                     Process process = new Process();
                     process.StartInfo = startArgs;
                     process.Start();

                    Process startedProcess = CheckIfProcessStarted(process);
                 }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message + "  " + ex.InnerException);
                Debug.WriteLine("Couldnt find the process so it never ran");
            }

            private Process CheckIfProcessStarted(Process process)
            {
                return Process.GetProcessById(process.Id);
            }