58 votes

Comment puis-je supprimer un fichier qui est verrouillé par un autre processus en C#?

Je suis à la recherche d'un moyen de supprimer un fichier qui est verrouillé par un autre processus à l'aide de C#. Je soupçonne que la méthode doit être en mesure de trouver le processus qui verrouille le fichier (peut-être par le suivi de l'poignées, bien que je ne suis pas sûr de savoir comment le faire en C#), puis fermez ce processus avant d'être en mesure de compléter le fichier à supprimer à l'aide de File.Delete().

37voto

Ishmaeel Points 7720

Tuer d'autres processus n'est pas une bonne chose à faire. Si votre scénario implique quelque chose comme de la désinstallation, vous pouvez utiliser l' MoveFileEx fonction de l'API pour marquer le fichier pour la suppression au prochain redémarrage.

Si il semble que vous avez vraiment besoin de supprimer un fichier en cours d'utilisation par un autre processus, je vous recommande de réexaminer le problème avant d'envisager des solutions.

16voto

James Devlin Points 6699

La méthode habituelle est comme suit. Vous avez dit que vous vouliez le faire en C# donc, ici, va...

  1. Si vous ne connaissez pas le processus qui a verrouillé le fichier, vous aurez besoin d'examiner chaque processus une poignée de la liste, et d'interroger chaque poignée de déterminer si elle identifie le fichier verrouillé. Faire cela en C# aura probablement besoin de P/Invoke ou un intermédiaire, C++/CLI pour appeler l'Api native vous aurez besoin.
  2. Une fois que vous avez compris quel(s) processus ont verrouillé le fichier, vous devrez en toute sécurité injecter une petite DLL native dans le processus (vous pouvez également injecter une DLL géré, mais c'est messier, que vous devez commencer ou de joindre à l' .NET runtime).
  3. Que bootstrap DLL puis ferme la poignée à l'aide de CloseHandle etc.

Essentiellement: la façon de déverrouiller "verrouillé" fichier injecter une DLL dans le processus fautif de l'espace d'adressage et à proximité vous-même. Vous pouvez faire cela en utilisant le code natif ou géré. N'importe quoi, vous allez avoir besoin d'une petite quantité de code natif ou au moins P/Invoke dans le même.

Liens utiles:

Bonne chance!

8voto

Orion Edwards Points 54939

Si vous voulez le faire par programmation. Je ne suis pas sûr... et j'aimerais vraiment ne le recommandons pas. Si vous êtes juste en dépannage de choses sur votre propre machine, SysInternals Process Explorer peut vous aider à

L'exécuter, utiliser la Poignée de commande (je pense que c'est soit dans la recherche ou la poignée de la barre de menu), et de chercher le nom de votre fichier. Une fois la poignée(s) est trouvé, vous pouvez forcer la fermer.

Vous pouvez ensuite supprimer le fichier et ainsi de suite.

Méfiez-vous, cela peut provoquer le programme qui détient les poignées à se comporter étrangement, comme vous l'avez juste tiré le fameux tapis de sous, mais il fonctionne bien lorsque vous déboguez votre propre errant code, ou lorsque visual studio / l'explorateur windows est de la merde et ne pas relâcher les descripteurs de fichiers, même si vous leur avez dit de fermer le fichier il y a des siècles... soupir :-)

5voto

Ryan Fox Points 5181

Vous pouvez utiliser ce programme, Poignée, pour trouver le processus qui a la serrure de votre fichier. C'est un outil de ligne de commande, donc je suppose que vous utilisez la sortie de la... je ne suis pas sûr de trouver du programme.

Si la suppression d'un fichier peut attendre, vous pouvez spécifier pour la suppression lorsque votre ordinateur démarre:

1. Démarrez REGEDT32 (W2K) ou REGEDIT (WXP) et naviguez jusqu'à: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager

2.

  • W2K: de Modifier, d'Ajouter de la Valeur..., Type de Données: REG_MULTI_SZ, Nom de la Valeur: PendingFileRenameOperations, OK

  • WXP: Edition, Nouveau, Valeur de chaînes Multiples, [enter] PendingFileRenameOperations

3. Dans la zone de Données, entrez "\??\" + nom du fichier à supprimer. Lfn peut être entré sans être incorporées dans des guillemets. Pour supprimer "C:\Long Nom du répertoire\Fichier Long Name.exe", saisissez les données suivantes:

\??\C:\Long Nom Du Répertoire\Fichier Long Name.exe

Puis appuyez sur OK.

4. Le "nom de fichier de destination" est une valeur nulle (zéro) de la chaîne. Il est entré comme suit:

  • W2K: Modifier, Binaire, sélectionnez Format des Données: Hex, cliquez à la fin de la chaîne hexadécimale, entrez 0000 (quatre zéros), OK.

  • WXP: cliquez-Droit sur la valeur, choisissez "Modifier les Données Binaires", cliquez à l' à la fin de la chaîne hexadécimale, entrez 0000 (quatre zéros), OK.

5. Fermer REGEDT32/REGEDIT et redémarrez pour supprimer le fichier.

(Sans vergogne volé quelques aléatoire forum, dans un souci de postérité.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X