c# - titel - title tag länge




Wie lösche ich eine Datei, die von einem anderen Prozess in C#gesperrt ist? (6)

Ich suche nach einer Möglichkeit, eine Datei zu löschen, die von einem anderen Prozess gesperrt ist, der C # verwendet. Ich vermute, dass die Methode in der Lage sein muss, den Prozess zu finden, der die Datei sperrt (vielleicht durch Verfolgen der Handles, obwohl ich nicht sicher bin, wie man das in C # macht) und schließe diesen Prozess, bevor ich die Datei löschen kann File.Delete() .


Andere Prozesse zu töten ist keine gesunde Sache. Wenn in Ihrem Szenario eine Deinstallation MoveFileEx , können Sie die Funktion MoveFileEx API verwenden , um die Datei beim nächsten Neustart zu MoveFileEx .

Wenn es so aussieht, dass Sie wirklich eine Datei löschen müssen, die von einem anderen Prozess verwendet wird, würde ich empfehlen, das tatsächliche Problem zu überdenken, bevor Sie Lösungen in Betracht ziehen.



Mit Hilfe von Orion Edwards habe ich den Sysinternals Process Explorer heruntergeladen, der mir wiederum gezeigt hat, dass die Datei, für die ich Probleme hatte, nicht vom Excel.Applications Objekt, sondern von der Tatsache, dass mein C # -Code Mail sendet, gehalten wird Code hatte ein Attachment-Objekt erstellt, das einen Griff zu dieser Datei offen ließ.

Sobald ich das sah, rief ich ganz einfach die dispose-Methode des Attachment-Objekts an und der Griff wurde losgelassen.

Der Sysinternals-Explorer ermöglichte mir, dies in Verbindung mit dem Visual Studio 2005-Debugger zu entdecken.

Ich empfehle dieses Tool sehr!


Oh, ein großer Hack, den ich vor Jahren angestellt habe, ist, dass Windows Sie nicht Dateien löschen lässt , aber Sie können sie verschieben.

Pseudo-Code-Art:

mv %WINDIR%\System32\mfc42.dll %WINDIR\System32\mfc42.dll.old
Install new mfc42.dll
Tell user to save work and restart applications

Als die Anwendungen neu gestartet wurden (wir mussten den Rechner nicht neu mfc42.dll ), luden sie die neue mfc42.dll , und alles war gut. Das, gepaart mit PendingFileOperations , um das alte beim nächsten Neustart des ganzen Systems zu löschen, funktionierte ziemlich gut.


Sie können dieses Programm Handle , um zu ermitteln, welcher Prozess die Sperre für Ihre Datei hat. Es ist ein Befehlszeilentool, also nehme ich an, dass Sie die Ausgabe von ... verwenden. Ich bin mir nicht sicher, es programmgesteuert zu finden.

Wenn das Löschen der Datei warten kann, können Sie sie beim nächsten Computerstart zum Löschen angeben:

  1. Starten Sie REGEDT32 (W2K) oder REGEDIT (WXP) und navigieren Sie zu:

    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager
    
  2. W2K und WXP

    • W2K:
      Bearbeiten
      Mehrwert...
      Datentyp: REG_MULTI_SZ
      PendingFileRenameOperations : PendingFileRenameOperations
      OK

    • WXP:
      Bearbeiten
      Neu
      Mehrstring-Wert
      eingeben
      PendingFileRenameOperations

  3. Im Bereich Daten geben Sie "\??\" + filename den zu löschenden "\??\" + filename ein. LFNs können ohne Anführungszeichen eingegeben werden. C:\Long Directory Name\Long File Name.exe die folgenden Daten ein, um C:\Long Directory Name\Long File Name.exe :

    \??\C:\Long Directory Name\Long File Name.exe
    

    Dann drücken Sie OK .

  4. Der "Zieldateiname" ist eine null (null) Zeichenkette. Es wird wie folgt eingegeben:

    • W2K:
      Bearbeiten
      Binär
      Wählen Sie Datenformat: Hex
      Klicken Sie auf das Ende der Hex-Zeichenfolge
      Geben Sie 0000 ein (vier Nullen)
      OK

    • WXP:
      Klicken Sie mit der rechten Maustaste auf den Wert
      wähle "Binäre Daten ändern"
      Klicken Sie auf das Ende der Hex-Zeichenfolge
      Geben Sie 0000 ein (vier Nullen)
      OK

  5. Schließen Sie REGEDT32/REGEDIT und REGEDT32/REGEDIT neu, um die Datei zu löschen.

(Schamlos gestohlen aus irgendeinem Zufallsforum , der Nachwelt halber.)


Wenn Sie es programmatisch machen wollen. Ich bin mir nicht sicher ... und ich würde es wirklich empfehlen. Wenn Sie nur Probleme auf Ihrem eigenen Computer beheben möchten , kann SysInternals Process Explorer Ihnen helfen

Führen Sie es aus, verwenden Sie den Befehl "Handle suchen" (ich denke, es befindet sich entweder im Menü "Suchen" oder "Handle"), und suchen Sie nach dem Namen Ihrer Datei. Sobald der / die Griff (e) gefunden wurde (n), können Sie sie gewaltsam schließen.

Sie können dann die Datei löschen und so weiter.

Vorsicht , dies kann dazu führen, dass sich das Programm, dem die Griffe gehören, merkwürdig verhält, da Sie gerade den sprichwörtlichen Teppich darunter herausgezogen haben, aber es funktioniert gut, wenn Sie Ihren eigenen fehlerhaften Code oder Visual Studio / Windows Explorer debuggen ist Mist und gibt keine Dateigriffe frei, obwohl man ihnen gesagt hat, sie sollen die Datei vor einiger Zeit schließen ... seufz :-)





file-locking