Comment puis-je savoir quel processus est le verrouillage d'un fichier à l'aide .NET?
J'ai vu plusieurs de réponses sur l'utilisation de Poignée ou Le Moniteur De Processus, mais je voudrais être en mesure de trouver dans mon propre code (C#)
le processus qui est le verrouillage d'un fichier.
J'ai un désagréable sentiment que je vais avoir à spelunk autour de l'API win32, mais si quelqu'un l'a déjà fait et peut me mettre sur la bonne voie, je vous remercie de l'aide.
Mise à jour
Des liens à des questions similaires
- Comment comprendre ce processus verrouillé un fichier à l'aide de c#?
- Outil de ligne de commande
- À travers un Réseau
- Le verrouillage d'un périphérique USB
- Unité de test échoue avec le fichier verrouillé
- suppression de fichier verrouillé
OriginalL'auteur AJ. | 2008-11-25
Vous devez vous connecter pour publier un commentaire.
L'une des bonnes choses au sujet de
handle.exe
est que vous pouvez l'exécuter en tant que sous-processus et analyser les données en sortie.Nous le faisons dans notre script de déploiement - fonctionne comme un charme.
mais handle.exe ne peut pas être distribué avec votre logiciel
Bon point. Ce n'était pas un problème avec le script de déploiement (usage interne), mais serait dans d'autres scénarios.
tout plein des exemples de code source en C#? valable aussi pour obtenir des processus de verrouillage d'un DOSSIER ?
Découvrez ma réponse pour une solution qui ne nécessite pas de handle.exe stackoverflow.com/a/20623311/141172
OriginalL'auteur orip
Il y a longtemps, il était impossible fiable pour obtenir la liste des processus de verrouillage d'un fichier parce que Windows n'a tout simplement pas la trace de cette information. À l'appui de la Le Gestionnaire de redémarrage de l'API, que l'information est maintenant suivi.
J'ai mis en place un code qui prend le chemin d'un fichier et retourne un
List<Process>
de tous les processus de verrouillage de fichier.À l'aide d'Autorisation Limitée (par exemple IIS)
Cet appel accède au registre. Si le processus n'a pas l'autorisation de le faire, vous obtiendrez ERROR_WRITE_FAULT, sens
An operation was unable to read or write to the registry
. Vous pourrait accorder la permission à votre compte restreint à la partie nécessaire de la base de registre. Il est en plus bien sûr d'avoir votre accès limité processus de définir un indicateur (par exemple, dans la base de données ou le système de fichiers, ou en utilisant un mécanisme de communication interprocessus tels que la file d'attente ou un tube nommé) et un deuxième processus appeler le Gestionnaire de Redémarrage de l'API.L'octroi de l'autre-que-autorisations minimales pour l'IIS de l'utilisateur est un risque pour la sécurité.
Si vous voulez simplement savoir à qui est le verrouillage d'une DLL spécifique, vous pouvez utiliser
tasklist /m YourDllName.dll
et analyser les données en sortie. Voir stackoverflow.com/questions/152506/...Seule solution qui ne nécessite pas de 3ème partie outils ou des sans-papiers, les appels d'API. Faut bien accepté de répondre.
J'ai essayé ceci (et ça marche) sur Windows 2008R2, Windows 2012R2, Windows 7 et Windows 10. J'ai trouvé qu'il avait à exécuter avec des privilèges élevés dans beaucoup de circonstances, sinon elle échoue lorsque vous essayez d'obtenir la liste des processus de verrouillage d'un fichier.
merci @EricJ. fonctionne très bien pour moi.
OriginalL'auteur Eric J.
Il est très complexe d'invoquer Win32 en C#.
Vous devez utiliser l'outil Handle.exe de http://technet.microsoft.com/en-us/sysinternals/bb896655.aspx
Après que votre code C# doivent être les suivantes:
bel exemple, mais à ma connaissance, handle.exe maintenant, montre un méchant invite à accepter certaines conditions lorsque vous l'exécutez sur un ordinateur client pour la première fois, qui, à mon avis, il disqualifie
Zahray: Vous pouvez accepter le cluf automatiquement par le passage d'une option de ligne de commande de
/accepteula
. J'ai mis à jour Gennady de réponse avec le changement.Vous ne pouvez pas redistribuer
handle.exe
Je suis en désaccord - il n'a pas de complexité lors de l'appel de l'api win32 en c#.
OriginalL'auteur
J'ai eu des problèmes avec stefan est la solution. Ci-dessous est une version modifiée qui semble bien fonctionner.
Mise à JOUR
Si vous voulez simplement savoir quel(s) processus sont le verrouillage d'une DLL particulier, vous pouvez exécuter et analyser les données en sortie de
tasklist /m YourDllName.dll
. Fonctionne sur Windows XP et versions ultérieures. VoirÀ quoi ça sert? tasklist /m "mscor*"
myProcessArray
est un membre de la classe (mais aussi retourné à partir de getFileProcesses()? En va de même pourmyProcess
.OriginalL'auteur user137604
Cela fonctionne pour les dll verrouillé par un autre processus. Cette routine ne trouverez pas par exemple qu'un fichier de texte est verrouillé par un wordprocess.
C#:
VB.Net:
Dans mon Exemple, j'utilise msi.dll qui n'est pas un .Net DLL.
OriginalL'auteur Stefan
plus simple avec linq:
OriginalL'auteur Gabriele Gindro