Comment vérifier le verrouillage de fichier?

Est-il possible de vérifier si un fichier est verrouillé sans utiliser un bloc try / catch?

À l'heure actuelle, la seule façon dont je sache est d'ouvrir le fichier et d'attraper une System.IO.IOException .

0
C'est une vieille question, et toutes les anciennes réponses sont incomplètes ou fausses. J'ai ajouté une réponse complète et correcte.
ajouté l'auteur Eric J., source
Je sais que ce n'est pas tout à fait la réponse à la question, mais certains sous-groupes de développeurs qui cherchent de l'aide pourraient avoir cette option: Si vous démarrez le processus qui possède le verrou avec System.Diagnostics.Process vous pouvez .WaitForExit ().
ajouté l'auteur amalgamate, source
Le problème est qu'une exception IOException peut être lancée pour de nombreuses raisons autres qu'un fichier verrouillé.
ajouté l'auteur JohnFx, source

5 Réponses

Non, malheureusement, et si vous y réfléchissez, cette information serait de toute façon sans valeur puisque le fichier pourrait être verrouillé la prochaine seconde (lire: court délai).

Pourquoi avez-vous besoin de savoir si le fichier est verrouillé de toute façon? Sachant que cela pourrait nous donner un autre moyen de vous donner de bons conseils.

Si votre code ressemble à ceci:

if not locked then
    open and update file

Puis entre les deux lignes, un autre processus pourrait facilement verrouiller le fichier, vous donnant le même problème que vous avez essayé d'éviter pour commencer: les exceptions.

0
ajouté
Oui, mais la vérification autonome pour savoir si un fichier est verrouillé est inutile, la seule façon correcte de le faire est d'essayer d'ouvrir le fichier dans le but que vous avez besoin du fichier, puis gérer le problème de verrouillage à ce stade. Et puis, comme vous le dites, attendez, ou traitez-le d'une autre manière.
ajouté l'auteur Lasse Vågsæther Karl, source
@Bart S'il vous plaît élaborer, où est cette méthode définie, pouvez-vous fournir un lien vers elle? Et s'il vous plaît noter que ma réponse a été posté 3e trimestre 2008, différents .NET runtime et tous, mais encore .... Qu'est-ce que File.ReadWaitForUnlock ?
ajouté l'auteur Lasse Vågsæther Karl, source
Il est maintenant possible d'obtenir le processus qui verrouille un fichier. Voir stackoverflow.com/a/20623302/141172
ajouté l'auteur Eric J., source
Je pense que le mieux à faire est une méthode File.ReadWaitForUnlock (file, timeout). et renvoie null ou le FileStream en fonction du succès. Je suis la logique ici?
ajouté l'auteur Bart Calixto, source
@ LasseV.Karlsen checkout ma réponse pour ce que j'ai fini par utiliser en fonction de votre réponse. ReadWaitForUnlock est ma propre méthode, modifiée en TryOpenRead à la fin.
ajouté l'auteur Bart Calixto, source
Vous pourriez argumenter la même chose pour les droits d'accès bien que cela soit bien sûr plus improbable.
ajouté l'auteur ctusch, source
Si le fichier est verrouillé, nous pouvons attendre un certain temps et réessayer. Si c'est un autre type de problème avec l'accès au fichier, nous devrions simplement propager l'exception.
ajouté l'auteur DixonD, source
@ LasseV.Karlsen Un autre avantage de faire un contrôle préventif est que vous pouvez avertir l'utilisateur avant de tenter une longue opération et d'interrompre à mi-chemin. Le verrou qui se produit à mi-chemin est toujours possible et doit être manipulé, mais dans de nombreux cas, l'expérience de l'utilisateur sera considérablement améliorée.
ajouté l'auteur Thiru, source

Vous pouvez appeler LockFile via interop sur la région Cela ne déclenchera pas d'exception. S'il réussit, vous aurez un verrou sur cette partie du fichier (qui est détenue par votre processus), ce verrou sera conservé jusqu'à ce que vous appeliez UnlockFile ou votre processus meurt.

0
ajouté

Vous pouvez voir si le fichier est verrouillé en essayant de le lire ou de le verrouiller vous-même en premier.

Please see my answer here for more information.

0
ajouté

Ensuite, entre les deux lignes, un autre processus pourrait facilement verrouiller le fichier, vous donnant le même problème que vous avez essayé d'éviter: exceptions.

Cependant, de cette façon, vous savez que le problème est temporaire et réessayez plus tard. (Par exemple, vous pourriez écrire un fil qui, si vous rencontrez un verrou en essayant d'écrire, continue à réessayer jusqu'à ce que le verrou soit parti.)

D'autre part, l'exception IOException n'est pas assez spécifique pour que le verrouillage soit la cause de l'échec de l'E / S. Il pourrait y avoir des raisons qui ne sont pas temporaires.

0
ajouté

Au lieu d'utiliser interop, vous pouvez utiliser les méthodes de classe .NET FileStream Lock et Unlock:

FileStream.Lock http://msdn.microsoft.com/en-us/library/system.io.filestream.lock.aspx

FileStream.Unlock http://msdn.microsoft.com/en-us/library/system.io.filestream.unlock.aspx

0
ajouté
C'est vraiment la bonne réponse, car elle donne à l'utilisateur la possibilité de non seulement verrouiller / déverrouiller des fichiers mais aussi des sections de fichiers. Tous les commentaires "Vous ne pouvez pas faire cela sans transactions" peuvent soulever une préoccupation valide, mais ne sont pas utiles car ils prétendent que la fonctionnalité n'est pas là ou est cachée quand elle ne l'est pas.
ajouté l'auteur BrainSlugs83, source
En fait, ce n'est pas une solution car vous ne pouvez pas créer une instance de FileStream si le fichier est verrouillé. (une exception sera lancée)
ajouté l'auteur Zé Carlos, source