代码之家  ›  专栏  ›  技术社区  ›  Pierre Arnaud

Process.WaitForExit失败后立即删除EXE文件

  •  0
  • Pierre Arnaud  · 技术社区  · 15 年前

    我做了以下工作:

    1. C:\temp\x.exe

    2. 以启动可执行文件 System.Diagnostics.Process.Start 然后通过调用 WaitForExit Process 返回的对象 Start .

    3. 删除可执行文件 C:\temp\x.exe

    在某些机器上,这非常有效,但在其他机器上,调用 DeleteFile 外国退出 返回,这并不意味着Windows已使用EXE完成。

    我的选择是什么?最明显的一点是,你应该再试一次 删除文件 几毫秒后,在循环中,直到删除成功或循环超时。但是有没有更干净的方法来等待每个人都关闭一个文件呢?

    1 回复  |  直到 15 年前
        1
  •  1
  •   Rune FS    15 年前

    有几个原因可以让你的exe在执行完毕后仍然被锁定。有些与代码有关,有些与系统有关。对于您的代码,我可以考虑的两个主要原因是:

    第二个问题是,即使流程已经完成,但执行并不意味着它是在系统透视图中完成的。

    第一个可以避免,第二个可以在进程列表中监视,但您仍然有一包可能的锁(您的程序并行执行两次,病毒扫描,一些人手动清理临时文件夹,光盘清理向导)。所以我建议要么修改程序的逻辑。如果可执行文件是用c写的,加载二进制文件并执行程序,而不是复制文件。

    如果出于某种原因需要在每次执行文件时复制该文件,请生成一个低优先级清理线程。如果WaitForExit调用失败,让它在调用WaitForExit后尝试清理;如果失败,则在x毫秒后重试;如果失败,则在2x后重试,以此类推。

    话虽如此,我想他们可能是(可能是非托管的)API调用,用于在系统级别上查找文件锁。就我个人而言,我会让系统自己解决这个问题