Wenn Spam zum Spammer macht←▼→BUOA! als Referenz

delphi,software,tippstricks

Symbolische Links erzeugen

Erstellt: 03.10.2022 Geändert: 24.10.2022 Lesedauer 1 - 2 Min.

In OffSiteEdit sollte eine XAMPP-Umgebung bequem mit dem jeweilige Projekt verknüpfbar sein. Windows 10 kann mittlerweile Symlinks. Die perfekte Lösung dafür.

Delphi bietet dafür einen Befehl an:

CreateSymLink(Link,Target);

Trotz intensiver Versuche konnte (von mir) damit kein Symlink erzeugt werden – was eventuell erklärt, weshalb es dafür im Netz keine (funktionierenden) Beispiele gibt. Wer ein funktionierendes hat… .

Die Kommandozeile bietet für das Anlagen eines Symlinks den Befehl mklink, der sich problemlos aufrufen lässt. Damit im Programm eine Rückmeldung erfolgt, ob das geklappt hat, ist eine kleine Hilfsfunktion entstanden, mit der

Damit beim Warten der Rechner benutzbar bleibt, wird eine Warteschleife durchlaufen, in der Systemmeldungen abgearbeitet werden (können).

Diese Lösung ist die Summe diverser Versuche und Erkenntnisse, die einiges an Zeit verschlungen haben. Falls sie in einem Projekt „Zeit spart“ würde ich mich über eine Rückmeldung mittels ✉-Button freuen.

Download

⤓ Pascal/Delphi-Unit ⤓ Download mit Rechtsklick
Delphi-Quellcode vom 04.11.2022, 17:19 Uhr, Größe: 1.2 KB
unit warten_symlink;

interface

// Wartet ohne Blockerien
procedure Warte(Millisekunden Integer);
// Erzeugt Symlink, löscht wahlweise vorhandenen
function symlink(SymPfad,PhysPfad:string;remove:boolean):Boolean;

implementation

uses System
.Classes,System.SysUtils,Vcl.Forms,System.DateUtilsWinApi.ShellApi,WinApi.Windows;

procedure Warte(Millisekunden Integer);
var 
ZP TDateTime;
begin
  ZP
:=IncMilliSecond(Now,Millisekunden);
  while 
ZP Now do
    
Application.ProcessMessages;
    
sleep(10);
end;

function 
symlink(SymPfad,PhysPfad:string;remove:boolean):Boolean;

Begin
// Letzten Backslash raushauen, falls einer da ist
  
PhysPfad := ExcludeTrailingPathDelimiter(PhysPfad);
  if 
remove then
     
if DirectoryExists(SymPfad,falsethen
       Begin
         RemoveDir
(SymPfad);
// Einen Moment auf das Filesystem des Rechners warten
         
Warte(500);
       
End;

  var 
sysparm string := '/K mklink /J ' SymPfad ' ' PhysPfad;
  
ShellExecute(0nil'cmd'PChar(sysparm), nilSW_HIDE);
// wieder etwas warten
  
Warte(500);
// Prüfen, ob es geklappt hat    
  
if DirectoryExists(SymPfad,falsethen
    Result 
:= True
  
else
    
Result := False;
End;

end.

Die Wartefunktion ist eine Modifikation des Musters vom Delphi-Teff.

Nachtrag:

Zwischenzeitlich ist mir klar geworden, weshalb CreateSymLink an der von mir gestellten Aufgabe scheitert: Weil dafür eine Junction erforderlich ist. Das ist ein relevantes Detail, das mir bisher schlicht entgangen ist. Was die Funktion »symlink« umso nützlicher, wenn auch „falsch benannt“ macht.