Unter bestimmten Umständen löscht der rm
-Befehl in Git-Bash Dateien, die nicht im Explorer, in der cmd-Eingabeaufforderung, in PowerShell oder mit C ++ - Standardbibliotheksaufrufen gelöscht werden können.
Warum?
Das ist verwirrend für mich, weil ich weiß, dass es hier keine Magie gibt und ich nehme an, dass sie alle dieselbe Win32-API verwenden.
Ich habe beispielsweise Datenbank-Snapshots, die offen bleiben und nicht mit den anderen beschriebenen Methoden gelöscht werden können, aber erfolgreich von Git-Bash rm
:
Explorer löschen: "Die Aktion kann nicht abgeschlossen werden, da die Datei geöffnet ist."
cmd: del <path>
: "Zugriff verweigert"
PS: Remove-Item -Force -Path <path>
: "Element kann nicht entfernt werden. Der Zugriff auf den Pfad wurde verweigert."
C ++ remove()
: gibt -1
C ++ unlink()
: gibt -1
C ++ _unlink()
: gibt -1
git-bash rm <path>
: Erfolg
Das oben genannte kann für verschiedene Dateien wiederholt durchgeführt werden.
Es gibt andere gesperrte Dateien, die git-bash rm
erfolgreich löscht (ich habe es in der Vergangenheit benutzt, nicht kürzlich und ich habe keine anderen spezifischen Beispiele).
Aber es funktioniert nicht immer: In einer Testanwendung habe ich eine Textdatei mit fopen()
geöffnet und keine der Methoden, einschließlich Git-Bash rm
, konnte sie erfolgreich löschen.
Also, wie funktioniert Git-Bash rm?
Ich konnte herausfinden, wie das funktioniert.
Interessanterweise habe ich das Strace-Dienstprogramm von Git-Bash für den Befehl rm
verwendet.
Es stellt sich heraus, dass Git Bash CygWin verwendet und die Löschroutine in gefunden wird CygWin syscalls.cc-Datei , die versucht, eine Datei auf verschiedene Arten zu löschen.
Schließlich wird versucht, die Datei in den Papierkorb zu verschieben, wo sie die gesperrte Datei löscht, indem sie mit dem Windows-Treiber NtOpenFile () mit einem FILE_DELETE_ON_CLOSE-Flag geöffnet und dann mit NtClose () geschlossen wird.
Ich bin mir nicht sicher, ob es richtig wäre, den Code von CygWin in die Antwort hier zu kopieren, aber Details zu all dem finden Sie in dem angegebenen Link.
Tags und Links c++ powershell git-bash