2008-10-23 10 views
2

Je dois récupérer à partir d'un cas d'erreur dans lequel un fichier est laissé dans un état verrouillé. Comment puis-je dans C# dire ce fichier pour réinitialiser ses verrous? Je dois ajouter à cela le fichier est ouvert par une DLL tierce et je n'ai pas réellement accès à la poignée de fichier.Suppression des verrous de fichier

Répondre

1

Vous pourriez peut-être commencer un processus de ligne de commande comme filet ou psfile avec quelque chose le long des lignes de:

System.Diagnostics.Process.Start("psfile c:\myfile.txt -c");

Vous pouvez obtenir psfile here.

Vous pouvez également utiliser

net file ID /close

mais auriez-vous besoin de connaître l'ID de fichier, ce qui prendrait un peu plus de travail.

Untested, mais cela devrait vous donner un point de départ.

0

Vous devez fermer le fichier en utilisant .Close(). Vous devez vous assurer que vous avez toujours un moyen d'accéder à l'objet fichier.

Vous pouvez généralement éviter cette erreur en écrivant une construction try {} ... finally {} après le code de vos E/S. Dans le bloc finally {}, vous appelez la méthode Close de votre objet fichier, empêchant cette condition. Vous pouvez également utiliser un bloc {} lors de la création de vos fichiers, ce qui permet également de résoudre ce problème.

+0

Cela fonctionnerait si je n'ouvrais pas le fichier dans une DLL tierce. – Erin

5

Le verrouillage d'un fichier est sous la responsabilité du système d'exploitation (au nom du programme qui l'ouvre). Si un fichier est laissé dans un état verrouillé, c'est vraiment à l'OS de déverrouiller. Cela se produit généralement automatiquement lorsque le processus qui a ouvert le fichier se ferme.

Il y a, cependant, un utilitaire vraiment cool que j'ai trouvé qui aidera. C'est ce qu'on appelle Unlocker.

1

Je voudrais vraiment envisager de trouver un autre dll 3ème partie. Tout système traitant des flux doit répondre correctement aux conditions d'erreur et ne pas laisser des verrous de fichiers en place.

Est-il possible que la bibliothèque fournisse une condition d'erreur de nettoyage, vous venez de la regarder? Essayez quelque chose comme ce qui suit,

try { 
    thirdPartyObj = new ThirdPartObj(); 
    // Some possible error causing object actions 
catch(Exception ex) { 
    thirdPartyObj = null; // The object should close its resources 
} 
+0

Le processus se bloque et mange jusqu'à 50% du processeur. Dans les autres cas, il retournera un code d'erreur. C'est une fonction statique dans une DLL C++. – Erin