Как узнать, успешно ли Process.Start()?
Я пробовал два разных метода для запуска процесса.
Первый
Определение определяется как параметры метода 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, и он прекрасно работает.
Ответы
Ответ 1
На странице MSDN на Process.Start() указано, что этот метод имеет перегрузку типа Boolean, где значения возврата означают:
true, если запущен ресурс процесса; false, если новый ресурс процесса (например, если существующая процесс используется повторно).
Кроме того, он может использовать три исключения:
- InvalidOperationException
В компоненте Process StartInfo не указано имя файла.
-or-
Элемент ProcessStartInfo.UseShellExecute свойства StartInfo является истинным, а ProcessStartInfo.RedirectStandardInput, ProcessStartInfo.RedirectStandardOutput или ProcessStartInfo.RedirectStandardError - true.
При открытии связанного файла произошла ошибка.
Объект процесса уже удален.
Чтобы использовать эту перегрузку Process.Start() (которая является единственной нестатической перегрузкой метода), вам нужно создать экземпляр класса Process с помощью объекта ProcessStartInfo.
Пример этого ниже:
ProcessStartInfo processStartInfo = new ProcessStartInfo("EXCEL.EXE");
Process process = new Process();
process.StartInfo = processStartInfo;
if (!process.Start())
{
// That didn't work
}
Хотя, учитывая, что это все еще возможно, вы, вероятно, лучше просто обертываете захват вокруг одного из статических методов .Start().
Учитывая, что кажется очевидным, что вызов Process.Start() будет работать или нет, и вы можете определить это из возвращаемого значения, равного 0 (или генерируемое исключение).
Как только ваш процесс запущен, вы имеете много контроля над вещами, а свойства класса Process, такие как HasExited, позволяют вам проверить, в каком состоянии находится этот процесс.
Короче говоря, если пользователь не имеет превосходства на своем компьютере, Process.Start() выдает исключение.
Ответ 2
Вы можете проверить свойство Process.ExitCode
для значения 0
(успех).
Ответ 3
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
}
Ответ 4
Чтобы точно определить, действительно ли процесс запущен, я попытался найти идентификатор процесса, если он найдет идентификатор процесса, он продолжит работу, если не сможет найти идентификатор процесса, он войдет в catch и напечатает оператор отладки.
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);
}