2009-07-08 7 views
0

Ich habe einige Code, die folgende Ausnahme ausgelöst hat:Welcher Prozess greift auf die Datei zu, die eine IOException verursachte, als ich versuchte, sie zu löschen?

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... 

Normalerweise weiß ich das zu bedeuten habe ich eine Ausnahme irgendwo hatte und nicht die relevant (z) StreamReader aufräumte.

Gelegentlich (nur gelegentlich, normalerweise ist es meine Schuld) Ich bekomme die Situation, wo es etwas außerhalb meines Programms hat eine Sperre für die Datei stattdessen (wie mein Texteditor, der immer noch meine Schuld ist, aber weniger böse als ein Fehler verursacht von mir nicht aufräumen nach mir selbst).

Gibt es eine Technik, die ich programmatisch verwenden kann, um festzustellen, welcher Prozess die Datei nicht verfügbar ist?

  • Ist es mein Prozess?
  • Ist es ein anderer Prozess auf dieser Maschine? Wenn ja, wie lautet der Name?
  • Wird von einem Remote-Computer über Dateifreigabe zugegriffen? Wenn ja, habe ich eine Chance, relevante Informationen zu erfahren?

Was würde in der Methode gehen 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; 
} 

Antwort

1

Nun, es ist definitiv schwer zu tun. Es ist möglich, eine Liste der geöffneten Handles zu lesen, aber wenn Sie den Prozessnamen durch das geöffnete Handle erhalten müssen, benötigen Sie Zugriff auf den Kernel-Speicher (ms Design-Fehler). Programme wie Unlocker sind deshalb auf speziell geschriebene Treiber angewiesen (und haben Probleme mit älteren Systemen, x64-Systemen und so weiter).

Wenn Sie jedoch unter Vista arbeiten, dann können Sie einen Trick verwenden und Prozess abrufen, der Ihre Dateien mithilfe von Restart Manager sperrt. Lesen Sie mehr here (Restart Manager and Generic Method Compilation).

Update: Es gibt eine Möglichkeit zu erkennen, welches Programm bestimmte Datei unter Windows XP geöffnet ist. Einige Programme (obwohl kleine Menge von ihnen, ich weiß nur über MS Office) Verweise in globalen laufenden Objekttabelle, so dass Sie solche Informationen extrahieren können. Diese Methode ist knifflig, und wie ich schon sagte, tun dies sehr wenige Programme, aber das ist immer noch eine Option.

Here you can find FileLocker class, die Windows Explorer über verwendete Datei benachrichtigen. Sie müssen die Logik von dieser Klasse umkehren, um ein Programm zu finden, das eine bestimmte Datei verwendet.

Verwandte Themen