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
- optional ein eventuell vorhandenes Verzeichnis entfernt wird, damit der Symlink vom System erzeugt werden kann,
- der übergebene Pfad sicher ohne
\
am Ende ist, wasmklink
scheitern lässt, - dem Dateisystem etwas Zeit für korrekte Rückmeldungen lässt.
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
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.