2010-03-19 6 views
10

Existe-t-il un moyen .Net pour savoir exactement quel processus a verrouillé un fichier?Fichier verrouillé par quel processus?

EDIT: Je le fais parce que je veux faire savoir à mon utilisateur qu'il ne peut pas modifier/ouvrir le fichier, car pour le moment, un autre programme qu'il utilise (comme Excel) l'a ouvrir. J'espère que cela aide.

+1

L'information serait inutile, car au moment où vous faites quelque chose avec elle, il ne pourrait plus être précis. –

+7

Vraiment Josh? Vous êtes sûr de cela ... – SpaceghostAli

+0

@SpaceghostAli Les fichiers sont toujours verrouillés indéfiniment, non? –

Répondre

6

La réponse courte à cette question est non. Cependant, la réponse longue est qu'il existe différents appels API et méthodes WMI que vous pouvez utiliser pour trouver cette information, mais ne vous attendez pas à ce qu'il soit rapide et simple.

Si vous souhaitez utiliser les appels API, consultez la fonction NtQuerySystemInformation avec le paramètre SYSTEM_PROCESS_INFORMATION. C'est l'une de ces belles méthodes « sans-papiers » qui vient avec l'avertissement merveilleux:

NtQuerySystemInformation peut être modifié ou non disponible dans les futures versions de Windows . Les applications doivent utiliser les autres fonctions répertoriées dans cette rubrique.

Donc, je suggère d'éviter cela en faveur de l'utilisation de WMI.

Vous pouvez utiliser la classe WMI Win32_Process pour énumérer tous les processus en cours d'exécution sur la machine, puis énumérer tous les handles que chaque processus contient jusqu'à ce que vous trouviez le fichier que vous recherchez. Malheureusement, il n'y a pas de façon simple d'aller "hé, quel processus verrouille ce fichier", cela ne fonctionne que dans le sens inverse, vous devez rechercher la liste de processus jusqu'à ce que vous trouviez celui qui verrouille le fichier qui vous intéresse.

Je recommanderais un bon petit article sur CodeProject intitulé How To: (Almost) Everything In WMI via C# Part 2: Processes. (La partie 1 est aussi une bonne lecture si vous aimez ce genre de chose)

0

On dirait que quelqu'un a compris celui-ci dehors (et vous pouvez en apprendre un peu le français aussi bien :))

http://www.axcis.com.au/bb/viewtopic.php?p=505

+0

Ce sont des fichiers actifs par processus. Il cherche l'inverse. –

+0

True - si la performance n'est pas critique, vous pouvez enum la sortie de tous les processus recherchant le fichier. – holtavolt

+0

Quand j'ai implémenté quelque chose comme ça pour un serveur Novell, je devais le faire à l'envers comme ça - rechercher tout ce qui est à la recherche du fichier. –

1

Eh bien ... ce n'est pas exactement une façon .NET de le faire ... mais en supposant que vous voulez juste savoir en utilisant un utilitaire facile, consultez Handle from SysInternals.

+2

Je pense qu'Irwin se demande comment le faire de façon programmatique, je ne pense pas que cela l'aide vraiment avec ça. –

+0

@Simon Eh bien, techniquement, il pourrait piéger l'exception, puis appeler par programmation cet outil de ligne de commande pour obtenir le (s) processus utilisant actuellement le fichier. Loin d'être idéal, oui, mais possible! –

Questions connexes