Junction-Wrapper für .Net

    • C#
    • .NET 4.5

      Junction-Wrapper für .Net

      Das .Net Framework bietet mit dem System.IO-Namespace einen guten Wrapper für die meisten IO-Operationen, allerdings musste ich kürzlich eine spezifische Funktionalität vermissen.
      Windows erlaubt Links im Dateisystem, mit denen eine Datei/ein Ordner an einen anderen Ort "umgeleitet" werden kann. Dies erlaubt es z.B. den Inhalt zwei verschiedener Pfade synchron zu halten, oder es erlaubt das Verschieben von Dateien und Ordnern an einen anderen Ort, obwohl die eigentlich nicht vorgesehen ist.
      Das Framework bietet von Haus aus leider keine Möglichkeit, diese Links zu erstellen und zu bearbeiten, weswegen man auf die Windows API zurückgreifen muss. Da es dabei nicht mit einem einfachen Aufruf getan ist veröffentliche ich hier meine Ergebnisse, damit anderen die stundenlange Arbeit erspart bleibt. Beachtet, dass sich dieser Code ausschließlich auf das Erstellen von Ordner-Links bezieht, es können damit keine Dateien gelinkt werden.


      Es gibt zwei verschiedene Arten von Links, die für mein Vorhaben in Frage kamen, Junctions und Symbolic links. Beide Link-Arten fallen unter die Softlinks, sie funktionieren also Partitionsübergreifend.
      Ich habe mich für Junctions entschieden, da keine Administratorrechte erforderlich sind, um Junctions zu erstellen, im Gegensatz zu Symbolic links. Beachtet, dass Junctions dafür ausschließlich auf lokale Partitionen verweisen können.


      Codebeispiel
      Die Klassen im JunctionNET.IO-Namespace verhalten sich weitestgehend so wie System.IO.Directory und System.IO.DirectoryInfo.

      Link erstellen:

      C#-Quellcode

      1. using JunctionNET.IO
      2. // ...
      3. string linkPath = YXZ;
      4. string destinationPath = XYZ;
      5. Junction.Create(linkPath, destinationPath);


      Link bearbeiten:

      C#-Quellcode

      1. using JunctionNET.IO
      2. // ...
      3. string linkPath = YXZ;
      4. string destinationPath = XYZ;
      5. Junction.SetDestination(linkPath, destinationPath);


      Link löschen:

      C#-Quellcode

      1. using JunctionNET.IO
      2. // ...
      3. string linkPath = YXZ;
      4. Junction.Delete(linkPath);


      Prüfen, ob ein Link existiert:

      C#-Quellcode

      1. using JunctionNET.IO
      2. // ...
      3. string linkPath = YXZ;
      4. if (Junction.Exists(linkPath))
      5. {
      6. // ...
      7. }


      Ziel eines Links abfragen:

      C#-Quellcode

      1. using JunctionNET.IO
      2. // ...
      3. string linkPath = YXZ;
      4. string destinationPath = Junction.GetDestination(linkPath);


      Für alle Funktionen gibt es auch ein objektorientiertes Äquivalent durch die JunctionInfo-Klasse.
      Dateien