Einführung
Neben den altbekannten Dateienverknüpfungen (*.lnk-Dateien) kennt Windows auch noch andere Arten der Verknüpfungen. Dazu möchte ich an dieser Stelle eine kurze Einführung geben.
symbolische Verknüpfung / Softlink
Allgmeines
Eine symbolische Verknüpfung, ist eine Verknüpfung in einem Dateisystem (Dateien und Verzeichnisse), die auf eine andere Datei oder ein anderes Verzeichnis verweist. Es ist also lediglich eine Referenz auf die Zieldatei bzw. das Zielverzeichnis. Seit Windows Vista bzw. Windows Server 2008 (beide intern Windows NT 6.0) stehen über das Win32-API echte symbolische Verknüpfungen zur Verfügung, die transparent im Dateisystem vorliegen und auf Dateien und Verzeichnisse des eigenen Computers verweisen können. Zum Anlegen dieser symbolischen Verknüpfung wird das Recht Create Symbolic Link benötigt. Dieses steht standardmäßig nur Benutzern mit Administratorrechten zur Verfügung. Weiterhin muss beim Anlegen der Verknüpfung bekannt sein, ob das Ziel eine Datei oder ein Verzeichnis ist. Aus diesen Gründen sind die symbolischen Verknüpfungen von Windows nicht vollständig kompatibel zu POSIX.
Anlegen symbolischer Verknüpfungen ab Windows Vista:
c:\>mklink "C:\EinLink.pdf" "D:\EinDokument.pdf"
c:\>mklink /d "D:\Pfad1\Neues Verzeichnis" "..\Pfad2\Reales Verzeichnis"
c:\>mklink /d "C:\Netzwerkfreigabe" "\\meinserver\meinefreigabe"
Anzeigen, wohin eine symbolische Verknüpfung verweist – der Parameter /al filtert die Ausgabe auf symbolische Verknüpfung (& Reparse Points):
c:\>dir /al /s
Löschen symbolischer Verknüpfungen:
c:\>del "C:\Neue Datei"
c:\>rmdir /s /q "D:\Pfad1\Neues Verzeichnis"
c:\>rmdir /s /q "C:\Netzwerkfreigabe"
Symbolische Verknüpfungen unter Windows bleiben (genau wie unter UNIX) auch nach einem Neustart des Systems bestehen.
Achtung: Das Erstellen von Symbolischen Links erfordert in Windows nicht, dass die Zieldatei existiert. Das bedeutet auch, dass wenn die Zieldatei gelöscht wird, der symbolische Links ins Leere geht, aber trotzdem weiter existiert.
Programmierung
Links
- Symbolic Links in C#
- Detecting Symbolic Links in .NET
- Windows Vista – Creating symbolic links with C#
Abzweigungspunkte / Reparse Points
Allgemeines
Unabhängig davon gibt es seit der NTFS-Version 3.0, dem von Windows 2000 standardmäßig verwendeten Dateisystem, sogenannte Abzweigungspunkte (engl. „File System Reparse Points“, „Junctions“). Allerdings mangelte es bei Windows 2000 an mitgelieferten Werkzeugen zur Verwaltung von Abzweigungspunkten. Abzweigungspunkte sind den symbolischen Verknüpfungen auf Verzeichnisse sehr viel ähnlicher als die üblichen Verknüpfungen. Diese Abzweigungspunkte entsprechen unter Linux weitgehend dem Einhängen von Verzeichnisen an einer weiteren Stelle mittels mount –rbind.
Abzweigungspunkte können ab Vista mit mklink /J angelegt werden und bei älteren Versionen mit den bei Microsoft erhältlichen Zusatzprogrammen junction.exe und linkd.exe aus den Windows 2003 Resource Kit Tools.
C:\>mklink /J "C:\Neues Verzeichnis" "D:\Pfad\Reales Verzeichnis"
Das Aufheben eines Abzweigungspunktes erfolgt mittels folgenden Kommandozeilenbefehls:
C:\>rmdir "C:\Neues Verzeichnis"
Die Abzweigungspunkte man man ebenso mittels folgender Befehlszeile ermitteln
c:\>dir
<PFAD> /al /s [/b]
für die Ausgabe der Verzeichnisse, welche einen Junction Link / Reparse Point darstellen, kann man den Parameter /b verwenden
alternativ kann man auch folgenden Befehl verwenden:
- Deutsch: dir <PFAD> /AD /S | find “<VERBINDUNG>”
- Englisch: dir <PFAD> /AD /S | find “<JUNCTION>”
Anmerkung: Der zuerst genannte Befehl ist wesentlich performanter. Weiters kann “dir /AD /S | find … ” nicht mit dem Parameter /b für die reine Verzeichnisausgabe verwenden.
Wenn das Zielverzeichnis gelöscht wurde, bleibt der Junction Point weiter bestehen. Im Windows Explorer scheinen sie auch weiter mit dem gleichen Symbol auf. Nur wenn man dorthin navigieren möchte, bekommt man eine Fehlermeldung:
Powershell
Um mit PowerShell einen Reparse Point zu erstellen, können Sie den Befehl New-Item
mit dem -ItemType
-Parameter “Junction” verwenden, um einen Reparse Point zu erstellen. Hier ist ein Beispiel-Skript, das diesen Vorgang durchführt:
Programmierung
Es gibt zwar eine Bibliothek bei Codeplex (Manipulating NTFS Junction Points in .NET), dennoch ist es einfacher mittelst mklink Junction Points zu erstellen.
Links:
- NTFS reparse point
- Reparse Point
- Understanding Win32 Reparse Points
- Manipulating NTFS Junction Points in .NET
- HowTo: Correctly read reparse data
- Reparse Points in Vista
Hardlinks
Allgemeines
NTFS-Partitionen (nicht FAT und FAT32) unterstützen bis zu 1023 harte Links pro Datei. Zum Erstellen harter Links eignen sich beispielsweise das Programm fsutil hardlink utility (unter Windows XP), der mklink-Befehl (unter Vista) oder Programme anderer Hersteller.
Um mit dem Microsoft-Werkzeug fsutil den harten Link „Neue Linkdatei.txt“ zu erzeugen, der auf die Datei „Quelldatei.txt“ verweist, ist das folgende Kommando einzugeben:
fsutil hardlink create "Neue Linkdatei.txt" "Quelldatei.txt"
bzw. ab Vista:
mklink /H "Neue Linkdatei.txt" "Quelldatei.txt"
Zulässig wäre beispielsweise:
D:\dira\Anton.txt → D:\dirb\dirx\Berta.txt oder
D:\dirc\Carla.bak → D:\dirb\dirx\Berta.txt usw.
Dadurch würden alle Zugriffe auf die Datei D:\dira\Anton.txt für den Anwender bzw. das Programm nach D:\dirb\dirx\Berta.txt umgeleitet. Es wird dann auch tatsächlich diese Datei bearbeitet, der Anwender merkt davon nichts.
Auflisten der Hardlinks:
Hardlinks lassen sich mit “dir /al” nicht auflisten. Auch andere Programme, wie beispielsweise Junction Link Magic und NTFSLinksView können Hardlinks nicht erkennen.
Mit FindLinks kann man jedoch auch solche Hardlinks identifizieren (selbiges ginge auch mit fsutil.exe hardlink list C:\XY). Auch mit LinkShellExtension kann man dies.
C:>for /r C:\Windows\ %X in (*.*) do (findlinks %X) >> info.txt
Anders als unter Unix kann kein harter Link gelöscht werden, solange die referenzierte Datei von einer Anwendung geöffnet, d.h. ein Filehandle darauf gesetzt ist.
Anmerkung: Anders als bei Softlinks muss die Zieldatei existieren, wenn der Link erstellt wird. Die Datei existiert physisch am Datenträger solange, bis der letzte Verweis auf die Datei gelöscht wird.
Programmierung
siehe eigene Seite.
Links
- CreateHardLink function | CreateHardLinkTransacted function
- Hard Links and Junctions
- C# – HardLink erstellen
- Hardlink erstellen mit C#
- Hard Links vs. Soft Links
- HardLinks – Manage your library of common classes
- Reparse Points and Symbolic Links A Windows 7 All-Points Bulletin
- Codeproject – Reparse Points in Vista
- Mounted Folders