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

delphi,software,tippstricks

Symbolische Links erzeugen

Erstellt: 03.10.2022 Aktualisiert: 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 03.10.2022, 19:34 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.DateUtils, WinApi.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,false) then
       Begin
         RemoveDir(SymPfad);
// Einen Moment auf das Filesystem des Rechners warten
         Warte(500);
       End;
 
  var sysparm : string := '/K mklink /J ' + SymPfad + ' ' + PhysPfad;
  ShellExecute(0, nil, 'cmd', PChar(sysparm), nil, SW_HIDE);
// wieder etwas warten
  Warte(500);
// Prüfen, ob es geklappt hat	
  if DirectoryExists(SymPfad,false) then
    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.