我执行以下操作:
将可执行文件复制到C:\temp\x.exe
使用System.Diagnostics.Process.Start
启动可执行文件,然后通过调用WaitForExit
返回的Process
对象上的Start
,等待进程同步退出。 / p>
删除可执行文件C:\temp\x.exe
在某些计算机上,这很有效,但在其他计算机上,对DeleteFile
的调用失败,因为该文件仍在使用中。所以似乎一旦WaitForExit
返回,它并不意味着Windows完成了EXE。
我有什么选择?显而易见的是,在几个毫秒之后,在循环中再次尝试DeleteFile
,直到删除成功或循环超时。但有没有更清洁的方法等待每个人关闭文件?
答案 0 :(得分:1)
执行执行后,exe仍然可以锁定的原因有几个。有些与您的代码有关,有些与系统有关。我能为你的代码考虑的两个主要原因是:
将exe文件复制到临时位置时如何关闭文件流,如果未明确释放,则释放时间可能会不时发生变化。
第二个是即使进程已完成执行并不意味着它是在系统透视图中完成的。
第一个可以避免第二个可以在进程列表中监视但是你仍然有一袋可能的锁(你的程序并行执行两次,病毒扫描一些人手动清理临时文件夹,光盘清理向导)。所以我建议要么重新修改程序的逻辑。如果可执行文件是用c#编写的,则加载二进制文件并执行程序而不是复制文件。
如果由于某种原因需要在每次执行时复制文件,产生一个低优先级的清理线程。让它尝试在WaitForExit调用之后进行清理,如果失败则让它在x毫秒之后再次尝试,如果再次失败再次尝试2x之后再等等。
话虽如此,我猜他们会(可能是非托管的)API调用来查找系统级别的文件锁。就我个人而言,我只是拥有自己的系统,但是