我尝试了两种不同的方法来启动进程。
第一个
定义被定义为 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 中,效果非常好。
最佳答案
Process.Start() 上的 MSDN 页面声明此方法具有 bool 类型的重载,其中返回值表示:
true if a process resource is started; false if no new process resource is started (for example, if an existing process is reused).
另外它可以抛出三个异常:
- InvalidOperationException
在 Process 组件的 StartInfo 中没有指定文件名。
-或-
当 ProcessStartInfo.RedirectStandardInput、ProcessStartInfo.RedirectStandardOutput 或 ProcessStartInfo.RedirectStandardError 为真时,StartInfo 属性的 ProcessStartInfo.UseShellExecute 成员为真。
- Win32异常
打开关联文件时出错。
- 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() 将抛出异常。
关于c# - 如何知道 Process.Start() 是否成功?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5750651/