Wie kann ich ohne folgende Knotenpunkte ein Windows-Verzeichnis entfernen?
Frage
Ich habe einen Perl-Skript, das ein Verzeichnis mit all seinem Inhalt löschen muss.
Manchmal enthält dieses Verzeichnis einen Verbindungspunkt in ein anderes Verzeichnis. Wenn ich ganz naiv rmtree()
, wird der rmtree()
Ruf auch alle Dateien im Zielordner des Übergangs löschen. Ich bin für einen Weg suchen, um nicht das zu tun, und stattdessen nur die Verbindung entfernen.
Nicht Perl-Lösungen auch anerkannt werden würde.
Lösung
I „Verbindungspunkt“ in Google gerade eingegeben und fand meinen Weg zu http://en.wikipedia.org/wiki/NTFS_junction_point
Eingabeaufforderung (cmd.exe)
- Die dir Befehl in Windows 2000 oder höher erkennt Knotenpunkte, die Anzeige statt in Verzeichnislisten (Verwendung dir mit der / A oder / AL-Befehlszeilenschalter).
- Alle dass Befehle normalerweise beeinflussen Dateien in einem normalen Verzeichnis wirken hier das gleiche. So der Befehl del myjunction sollten nicht verwendet werden - dies wird einfach löschen Sie alle Dateien in das gezielte Verzeichnis.
- Die Befehle rmdir und Bewegung gut funktionieren mit Kreuzungen, mit dem Vorbehalt, die sich bewegen wird nicht die Verbindung zu einem anderen bewegen lassen Volumen (im Gegensatz zu Windows- Explorer, wie oben erwähnt).
- Die rmdir Befehl ist sicher, dass es nur löscht den Verbindungspunkt, nicht die gezielte Dateien. Während der Wanderung durch das Verzeichnis mit der Kommandozeile Schnittstelle, Dateien gelöscht werden können, aber im Gegensatz zu Explorer können Verzeichnisse auch werden gelöscht (mit rmdir / s dirname für Beispiel).
- Mit dem Befehl linkd mit die / d ist eine sichere Art und Weise zu löschen Knotenpunkte.
Von dem, was ich sehen kann, kann man zum Beispiel dir
verwenden und die Ausgabe für <JUNCTION>
grep oder den Windows-rmdir
verwenden. Ich denke, man entweder davon aus Perl über system
verwenden kann.
Andere Tipps
Um herauszufinden, wo die Analysepunkte sind (oder „Knotenpunkte“, wenn man so will):
dir /a:l /b > myjunctions.txt
Werden alle Analysepunkte im aktuellen Verzeichnis angezeigt. Sie können / s hinzufügen, aber Vorsicht, dass die Analysepunkte innerhalb Analysepunkte werden ebenfalls aufgeführt werden.
Angenommen myjunctions.txt enthält die Zeile x: \ subdir \ foo. Um sie zu entfernen, können Sie ausgeben
fsutil reparsepoint "x:\subdir\foo"
Und voilá! Ihr Verbindungspunkt ist weg, und das ursprüngliche Verzeichnis ist unangetastet!
Fastcopy-Dienstprogramm tut dies: http://ipmsg.org/tools/fastcopy.html.en
Ich bin mit diesem Programm zum Kopieren oder Löschen von Ordnern, die Kreuzungen als Unterordner enthalten kann, so dass die Verbindungsziele unberührt bleiben. Die Knotenpunkte werden während des Kopierens richtig kopiert, auch wenn das Ziellaufwerk ist anders.
Windows Explorer zumindest in Windows 7 Ultimate arbeitet auch als wollte beim Löschen - Kreuzung Ziele bleiben intakt.
Aber das Kopieren von Ordnern, die Kreuzungen als Unterordner in Explorer enthalten noch nicht wie vorgesehen funktionieren - es tut wirklich etwas, das kann ich noch nicht vielleicht ganz vollständig beschreiben: die Kreuzung Ordner erscheinen als normale Ordner kopiert werden, aber ihr Inhalt ist leer.