2009-08-21 2 views
0

я делаю следующее:DeleteFile из EXE сразу после Process.WaitForExit терпит неудачу

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

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

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

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

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

ответ

1

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

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

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

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

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

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

+0

Первый из них исключен; Я использую CopyFile, ничего необычного там, и ручки правильно закрыты. Это должна быть ОС, которая делает что-то за кулисами, вскоре после того, как она завершила процесс выполнения. Я реализовал цикл повтора, но я был недоволен этим. Полагаю, это может быть интересной задачей для дальнейшего изучения таких инструментов, как ProcMon. –

Смежные вопросы