Heute hatte ich wieder das Problem, dass ich unter zwei verschiedenen Pfaden die gleiche Ausgabe einer Datei benötigte. Es ging um die INI-Datei von zwei Instanzen des gleichen Programmes. Als ich schon fast den Copy-Batch fertig hatte, um die eine Datei immer wieder über die andere zu kopieren, damit ich die Änderungen nicht doppelt pflegen muss, fiel mir eine bessere Alternative ein:

Hardlinks anlegen

Wenn man NTFS als Dateisystem einsetzt, dann kann man sogenannte Hardlinks anlegen. Das bedeutet, dass man auf die gleiche Datei einen echten Link legt. Man kann dann unter dem Pfad des Links und dem originalen Pfad auf die Datei zugreifen. Die Programme merken gar nicht, ob das ein Hardlink ist oder das Original, weil einfach ein echter Eintrag im Verzeichnis angelegt wurde.
Hier die Syntax:
fsutil hardlink create <neuer Dateinname> <vorhandener Dateiname>

Hier ein Beispiel:
Angenommen es existiert die Datei "E:\temp\dir1\MyOriginal.ini" und ich will auf die gleiche Datei auch unter dem Pfad "E:\temp\dir2\MyCopy.ini" zugreifen, dann kann man den Hardlink so anlegen:

C:\>fsutil hardlink create E:\temp\dir2\MyCopy.ini E:\temp\dir1\MyOriginal.ini
Hardlink erstellt für E:\temp\dir2\MyCopy.ini <<===>> E:\temp\dir1\MyOriginal.ini

Wenn man eher visuell orientiert ist, dann kann man natürlich auch Shell-Utilities verwenden. Ich habe von denen aber noch keines ausprobiert.

Hardlinks entfernen

Wenn man Hardlinks entfernen will, dann löscht man sie einfach, als seien sie Dateien. Dabei wird aber nur der Eintrag aus dem Verzeichnis gelöscht. Erst mit dem letzten Verweis wird auch die Datei gelöscht. Das gilt auch, wenn man das ursprüngliche Original zuerst löscht. Die "Kopie" bleibt erhalten.

Beispiel: lösche zuerst die ursprüngliche Datei und sehe trotzdem noch den Hardlink:

E:\temp>dir /B dir1
MyOriginal.ini

E:\temp>del dir1\MyOriginal.ini

E:\temp>dir /B dir2
MyCopy.ini

Erst wenn ich auch den letzten Verweis auf die Datei lösche, dann ist sie weg:

E:\temp>del dir2\MyCopy.ini

E:\temp>dir /B dir2

Hinweis: Hardlinks können leider nur auf Dateien in der gleichen Partition verweisen. Das gilt auch für Junction-Points…

Junction-Points (Abzweigungspunkte)

Leider geht das mit Verzeichnissen nicht. Hier bietet NTFS Junction-Points (Abzweigungspunkte) an. Sie arbeiten intern aber leider anders. Es werden wieder echte Links gelegt. Von Verzeichnis A nach Verzeichnis B. Unter B sehe ich also genau die Dateien, die unter A stehen. Deswegen die Warnung vorab: Wenn ich also eine Datei aus B lösche, dann ist sie auch aus A gelöscht.

Dazu benötigt man das Tool LinkD aus dem Windows Server Ressource Kit. So sieht die Syntax aus:

LINKD <Link-Verzeichnis> <originales Verzeichnis>

Beispiel:

E:\temp>dir /B dir1
file1.txt
file2.txt

E:\temp>linkd linkdir dir1
Link created at: linkdir

E:\temp>dir /B linkdir
file1.txt
file2.txt

Aber Vorsicht: Es ist in beiden Fällen jetzt das gleiche Verzeichnis.

E:\temp>dir /B dir1
file1.txt
file2.txt

E:\temp>del linkdir\file1.txt

E:\temp>dir /B dir1
file2.txt

Wenn man den Junction-Point wieder los sein will, dann geht das so:

E:\temp>linkd linkdir /D
The delete operation succeeded.

Das originale Verzeichnis ist dann mit samt Inhalt noch da.

Die Wikipedia listet ein paar Risiken und Nebenwirkungen, die interessant sind. Microsoft stellt auch ein paar weiterführende Infos bereit.

Und wie geht es weiter?

Diese netten Features wurden offenbar unter Vista aufgewertet. Wissenswertes dazu hat Daniel Melanchthon zusammengestellt.