Pergunta

Eu faço o seguinte:

  1. Copiar um executável para C:\temp\x.exe

  2. Inicie o executável com System.Diagnostics.Process.Start e depois esperar para que o processo de saída, de forma síncrona, chamando WaitForExit no objeto Process retornado por Start.

  3. 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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top