DeleteFile de um EXE imediatamente após Process.WaitForExit falhar
-
19-09-2019 - |
Pergunta
Eu faço o seguinte:
-
Copiar um executável para
C:\temp\x.exe
-
Inicie o executável com
System.Diagnostics.Process.Start
e depois esperar para que o processo de saída, de forma síncrona, chamandoWaitForExit
no objetoProcess
retornado porStart
. -
Excluir o
C:\temp\x.exe
executável
Em algumas máquinas, isso funciona muito bem, mas em outros, a chamada para DeleteFile
falhar, porque o arquivo ainda está em uso. Assim, parece que uma vez WaitForExit
retornos, isso não implica que o Windows é feito com o EXE.
Quais são as minhas opções aqui? A mais óbvia whould ser para tentar novamente a DeleteFile
alguns milissegundos mais tarde, em um loop, até que a exclusão bem-sucedida ou os tempos Loop Out. Mas há uma maneira mais limpa que esperar para um arquivo a ser fechado por todos?
Solução
Há uma razões poucos forma como o seu exe ainda pode ser bloqueado quando ele é feito em execução. alguns têm a ver com o seu código e alguns com o sistema. As duas principais razões que eu posso pensar fora para o seu código seria:
Como você fechar a filestream quando você copiar o arquivo exe para o local temporário, se ela não é liberada explicitamente o tempo de liberação pode mudar ao longo do tempo.
o segundo é mesmo que o processo é feito executando não significa que ele é feito de uma perspectiva do sistema.
A primeira pode ser evitar o segundo pode ser monitorado na lista de processos, mas você ainda tem um saco de possíveis bloqueios (o seu programa em execução duas vezes em paralelo, vírus varredura alguém limpar manualmente a pasta temp, Assistente de Limpeza de disco). Então eu sugiro que seja para refazer a lógica do programa. Se o executeable é escrito em C # carga do binário e executar o programa em vez de copiar o arquivo.
Se você por algum motivo precisa copiar o arquivo de cada vez que é executado gerar um segmento de baixa limpeza prioridade. deixá-lo tentar limpar após a chamada WaitForExit se isso falhar torná-lo tente novamente após x milissegundos se isso falhar tente novamente depois de 2x e assim por diante.
Dito isto eu acho que seus seria chamadas de API (provavelmente não gerenciados) para procurar bloqueios de arquivos em um nível de sistema. Pessoalmente, eu teria apenas que o sistema de auto descobrir isso embora