Process.Start возвращает null

Я пишу программу, которая запускает случайный файл в каталоге. файл может быть в любое время, но в основном видео или файлы изображений. каждый раз, когда я запускаю файл, я хочу закрыть предыдущий открытый. код:

    string FolderSelected = "";
    string FileName = "";
    Process proc;

    List<string> FilesDisplayed = new List<string>();

    public Form1()
    {
        InitializeComponent();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        if (FolderSelected == string.Empty)
            FolderSelected = Properties.Settings.Default.FilesDefaultFolder;

        if (proc != null)
        {
            proc.CloseMainWindow();
            proc.Close();
        }
        FileName = FetchRandomFile();
        proc = Process.Start(FileName);


    }

проблема в том, что я продолжаю получать proc = null (файл запущен должным образом), и я не могу извлечь ранее открытый процесс, чтобы закрыть его. Я знаю, что .NET повторно использует процессы, и поэтому он возвращает Null, но мне нужно переопределить это поведение. пожалуйста помоги, Guy.

Ответы

Ответ 1

EDIT: благодаря комментарию leppie, я подозреваю, что знаю ответ: я предполагаю, что вы начинаете что-то вроде изображения и повторно используете существующий процесс, чтобы открыть документ, а не создавать новый.

Я воспроизвел это с помощью этого простого тестового приложения:

using System;
using System.Diagnostics;

public class Test
{
    static void Main()
    {
        Process proc = Process.Start("image.tif");
        Console.WriteLine(proc == null);
    }
}

Это печатает "true", потому что использует dllhost.exe для размещения Windows Viewer, а не для создания нового процесса.

Ответ 2

Это даже не будет компилироваться (определенное задание). В качестве переменной метода proc является локальным только для метода объявления (/scope) - то есть button2_Click, что объясняет, почему вы не можете сохранить значения. Если proc предназначен для сохранения между вызовами, продвигайте его в поле (переменная для каждого экземпляра):

Process proc;
private void button2_Click(object sender, EventArgs e)
{
    if (proc != null)
    ...

Ответ 3

Чтобы устранить эту проблему, вы должны установить UseShellExecute в false, чтобы обойти оболочку.

Вместо

Process.Start("filename", "args")`

использование

Process.Start(new ProcessStartInfo() {
    Filename = "filename",
    Arguments = "args",
    UseShellExecute = false
}

Ответ 4

Чтобы решить эту проблему, вы должны сделать свой собственный процесс

  Process  process = new Process();
    process.StartInfo= new ProcessStartInfo(filename);
    process.Start();
    process.Disposed+= (s, e) =>      System.IO.File.Delete(filename);
    // and if you want to manually end the process you
    //could just use
 process.Dispose();

файл будет удален, если вы самостоятельно утилизируете свой Процесс или он был удален автоматически... конечно, не забудьте указать свой Процесс в той области, в которой вы можете его достичь

Ответ 5

Вы объявляете "proc" в области метода, поэтому, конечно, он всегда будет null, если он установлен в верхней части этого метода. Если вы хотите, чтобы ссылка вышла за пределы функции, объявите ее переменной уровня класса.

Вы каждый раз создаете процесс (возможно), Process.Start не возвращает null, но вы просто теряете ссылку на него, когда я выхожу из области видимости.