我想创建一个新的进程,即使调用进程已经终止,它也会自行清理。我在下面模拟了一个例子,使用记事本显示一个临时文件,我想在记事本关闭后删除它。
在下面的代码中,如果我取消注释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();
}
答案 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中不存在这样的支持。