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.