0

我执行以下操作:

  1. 将可执行文件复制到C:\temp\x.exe

  2. 启动可执行文件,然后通过调用返回的对象System.Diagnostics.Process.Start同步等待进程退出。WaitForExitProcessStart

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

在某些机器上,这很好用,但在其他机器上,调用DeleteFile失败,因为该文件仍在使用中。所以似乎一旦WaitForExit返回,并不意味着Windows已经完成了EXE。

我在这里有什么选择?DeleteFile显而易见的一个可能是在几毫秒后再次尝试,在一个循环中,直到删除成功或循环超时。但是有没有更干净的方法来等待每个人都关闭文件?

4

1 回答 1

1

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

将 exe 文件复制到临时位置时如何关闭文件流,如果未明确发布,则发布时间可能会不时更改。

第二个是即使过程完成执行并不意味着它是从系统角度完成的。

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

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

话虽如此,我猜他们将是(可能是非托管的)API 调用来查找系统级别的文件锁。就个人而言,我只是让系统自己弄清楚

于 2009-08-21T14:24:17.300 回答