是否有可能创建一个始终清理的流程?

时间:2010-12-11 19:02:31

标签: c# process

我想创建一个新的进程,即使调用进程已经终止,它也会自行清理。我在下面模拟了一个例子,使用记事本显示一个临时文件,我想在记事本关闭后删除它。

在下面的代码中,如果我取消注释WaitForExit()行,或者进入无限循环以模仿正在运行的调用程序,这将按预期工作。主要问题是调用程序完成时,因为事件不再处理。

我很感激有关如何处理此案的任何建议。

问候,

克里斯

    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 个答案:

答案 0 :(得分:3)

一种偷偷摸摸的方式是编写一个大约有这个的批处理文件:

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

答案 1 :(得分:2)

如果调用进程已退出,则无法再执行任何操作;它不存在。

一种选择是创建另一个后台线程的线程(将IsBackground设置为false)并在该线程上调用WaitForExit;这将在正常退出Main期间保持进程活动。但是,如果进程异常终止(任务管理器 kill ,或者只是拔出电源),则无法执行任何操作。

答案 2 :(得分:0)

特别是对于文件,您可以使用Win32 FileCreate和FILE_FLAG_DELETE_ON_CLOSE进行调查 - http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx 此外,我认为.Net Framework中不存在这样的支持。