2009-07-08 4 views
0

J'ai un code qui a jeté l'exception suivante:Quel processus accède au fichier qui a provoqué une exception d'E/S lorsque j'ai essayé de le supprimer?

System.IO.IOException: The process cannot access the file 'MyFileName' because it is being used by another process. 
    at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive) 
    at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive) 
    at System.IO.Directory.Delete(String path, Boolean recursive) 
    at MyCodeSomewhere... 

En général, je sais que cela veut dire que j'ai eu une exception quelque part et non tondu la (par exemple) StreamReader pertinents.

Occasionnellement (seulement de temps en temps, typiquement c'est ma faute) je reçois la situation où quelque chose en dehors de mon programme a un verrou sur le fichier (comme mon éditeur de texte, qui est toujours ma faute, mais moins méchant qu'un bogue causé par moi ne pas ranger après moi-même).

Existe-t-il une technique que je peux utiliser par programme pour détecter le processus qui provoque l'indisponibilité du fichier?

  • Est-ce mon processus?
  • Est-ce un autre processus sur cette machine? Si c'est le cas, quel est son nom?
  • L'ordinateur distant est-il accessible via un partage de fichiers? Si oui, ai-je une chance de trouver des informations pertinentes?

Que se passerait-il dans la méthode GetProcessNameCausingMeGrief?

catch (IOException ioEx) 
{ 
    string processName = GetProcessNameCausingMeGrief(ioEx); 
    if (processName == Process.GetCurrentProcess()) 
    { 
     throw new ApplicationException("Oops, this code still has it's own file locked", ioEx); 
    } 
    throw; 
} 

Répondre

1

Eh bien, c'est vraiment difficile à faire. Il est possible de lire la liste des poignées ouvertes, mais lorsque vous avez besoin d'obtenir le nom du processus par handle ouvert, vous devez accéder à la mémoire du noyau (défaut de conception ms). C'est pourquoi des programmes comme Unlocker s'appuient sur un pilote spécialement écrit (et ont des problèmes avec les systèmes plus anciens, les systèmes x64 et ainsi de suite). Cependant, si vous travaillez sous Vista, vous pouvez utiliser une astuce et obtenir un processus qui verrouille vos fichiers en utilisant le Gestionnaire de redémarrage. Lire la suite here (Restart Manager and Generic Method Compilation).

Mise à jour: Il existe un moyen de détecter quel programme est ouvert sous Windows XP. Certains programmes (bien que peu d'entre eux, je sais seulement sur ms office) mettent des références dans la table globale des objets en cours d'exécution, de sorte que vous pouvez extraire de telles informations. Cette méthode est délicate, et comme je le disais plus tôt, très peu de programmes le font, mais cela reste une option.

Here you can find FileLocker class qui notifie Windows Explorer sur le fichier utilisé. Vous devez inverser la logique de cette classe pour trouver le programme qui a utilisé un fichier particulier.

Questions connexes