Можно ли создать процесс, который всегда будет очищаться после себя? - PullRequest
2 голосов
/ 11 декабря 2010

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

В приведенном ниже коде это работает должным образом, если я раскомментирую строку WaitForExit () или, альтернативно, войду в бесконечный цикл для имитации запуска вызывающей программы. Основная проблема заключается в том, что вызывающая программа заканчивается, поскольку событие больше не обрабатывается.

Буду признателен за любые предложения о том, как справиться с этим делом.

С уважением,

Chris

    static void Main(string[] args)
    {
        string filename = @"c:\temp\example.txt";
        if (!File.Exists(filename))
            File.WriteAllText(filename, "abc");

        ProcessStartInfo psi = new ProcessStartInfo("notepad", filename);

        Process cmdProcess = new Process();

        Process p = new Process();
        psi.CreateNoWindow = true;
        p.EnableRaisingEvents = true;
        p.StartInfo = psi;
        p.Exited += (sender, e) => { File.Delete(filename); };

        p.Start();
        //p.WaitForExit();
    }

Ответы [ 3 ]

3 голосов
/ 11 декабря 2010

Подлый способ написать командный файл, который примерно такой:

notepad c:\temp\example.txt
del c:\temp\example.txt

и затем ваш процесс выполнит пакет вместо этого.

Рабочий образец (сохранить как c: \ test.bat):

echo FOO > c:\test.txt
notepad c:\test.txt
del c:\test.txt
del c:\test.bat
2 голосов
/ 11 декабря 2010

Если вызывающий процесс завершил работу, он больше не может ничего делать; его не существует.

Одним из вариантов будет создание другого потока, который не фонового потока (установите для IsBackground значение false) и вызов в этом потоке WaitForExit; это поддержит процесс при нормальном выходе из Main. Однако это ничего не может сделать, если процесс ненормально завершается (диспетчер задач kill или просто отключение питания).

0 голосов
/ 11 декабря 2010

С файлами, в частности, вы можете исследовать использование Win32 FileCreate с FILE_FLAG_DELETE_ON_CLOSE - http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx Также я не думаю, что в .Net Framework существует такая поддержка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...