Удалить файл EXE сразу после сбоя Process.WaitForExit - PullRequest
0 голосов
/ 21 августа 2009

Я делаю следующее:

  1. Скопируйте исполняемый файл в C:\temp\x.exe

  2. Запустите исполняемый файл с System.Diagnostics.Process.Start, а затем дождитесь синхронного завершения процесса, вызвав WaitForExit объекта Process, возвращаемого Start.

  3. Удалить исполняемый файл C:\temp\x.exe

На некоторых машинах это прекрасно работает, но на других вызов DeleteFile завершается неудачно, поскольку файл все еще используется. Таким образом, кажется, что как только WaitForExit возвращается, это не означает, что Windows завершает работу с EXE.

Какие у меня варианты здесь? Очевидным может быть повторная попытка DeleteFile через несколько миллисекунд, в цикле, пока удаление не будет успешным или цикл не завершится. Но есть ли более чистый способ ожидания закрытия файла всеми пользователями?

1 Ответ

1 голос
/ 21 августа 2009

Есть несколько причин, по которым ваш exe-файл все еще может быть заблокирован, когда он завершит выполнение. некоторые из них связаны с вашим кодом, а некоторые - с системой. Вот две основные причины, по которым я могу подумать над вашим кодом:

Как вы закрываете файловый поток при копировании exe-файла во временную папку, если он явно не выпущен, время выпуска может время от времени меняться.

второе - даже если процесс завершен, выполнение не означает, что он выполнен в системной перспективе.

Первый может быть исключен, второй можно отслеживать в списке процессов, НО у вас все еще есть мешок возможных блокировок (ваша программа выполняется дважды параллельно, кто-то проверяет на вирусы ручную очистку временной папки, мастер очистки диска). Поэтому я бы предложил либо переработать логику программы. Если исполняемый файл написан на c #, загрузите двоичный файл и запустите программу вместо копирования файла.

Если вам по какой-то причине нужно копировать файл каждый раз, когда он выполняется, создайте поток очистки с низким приоритетом. дайте ему попытаться очистить после вызова WaitForExit, если это не удастся, повторите попытку через x миллисекунд, если это снова не удастся, попробуйте после 2x и т. д.

При этом я предполагаю, что это будут (вероятно, неуправляемые) вызовы API для поиска блокировок файлов на системном уровне. Лично я хотел бы, чтобы система сама это выяснила, хотя

...