Question

Je fais ce qui suit:

  1. copier un fichier exécutable à C:\temp\x.exe

  2. Lancez l'exécutable avec System.Diagnostics.Process.Start puis attendez que le processus pour quitter, de manière synchrone, en appelant WaitForExit sur l'objet retourné par Process Start.

  3. Supprimer le C:\temp\x.exe exécutable

Sur certaines machines, cela fonctionne très bien, mais sur d'autres, l'appel à DeleteFile échoue, car le fichier est toujours utilisé. Il semble donc qu'une fois retourne WaitForExit, cela ne signifie pas que Windows se fait avec l'EXE.

Quelles sont mes options ici? La plus évidente whould d'essayer à nouveau la DeleteFile quelques millisecondes plus tard, dans une boucle, jusqu'à ce que la suppression réussit ou les temps de boucle sur. Mais est-il un moyen plus propre d'attendre un fichier pour être fermé par tout le monde?

Était-ce utile?

La solution

Il y a quelques raisons façon dont votre exe pourraient encore être verrouillés quand il est fait exécuter. certains ont à voir avec votre code et certains avec le système. Les deux principales raisons que je peux penser de votre code serait:

Comment fermer le filestream lorsque vous copiez le fichier exe à l'emplacement temporaire, si ce n'est pas libéré explicitement le moment de la libération pourrait changer de temps en temps.

la seconde est, même si le processus est fait d'exécution ne veut pas dire qu'il est fait dans une perspective de système.

Le premier peut éviter le second peut être contrôlé dans la liste des processus mais vous avez encore un sac de serrures possibles (votre programme d'exécution deux fois en parallèle, analyse antivirus certains un nettoyage manuel du dossier temporaire, assistant de nettoyage du disque). Je propose donc soit autorisé à reprendre la logique du programme. Si l'executable est écrit en C # charger le binaire et exécuter le programme au lieu de copier le fichier.

Si pour une raison quelconque a besoin de copier le fichier à chaque fois qu'il est exécuté spawn un fil bas de nettoyage prioritaire. laissez-le essayer de nettoyer après l'appel WaitForExit si cela échoue faire essayer à nouveau après x millisecondes si cela échoue essayer à nouveau après 2x et ainsi de suite.

Cela dit, je pense que leur serait API (probablement non géré) appelle à rechercher des verrous de fichier sur un niveau du système. Personnellement, je voudrais juste avoir le chiffre système, il auto que sur si

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top