Ich arbeite immer noch mit Turbo Pascal 7.0 an einer alten Anwendung. Die Anwendung läuft mittlerweile bei fast allen Kunden als 32-Bit-Anwendung. Leider nur fast, die Konvertierung (
Konvertiere TP7 zu Delphi) lief gut, nur gibt es doch ein kleines Problem. Ist egal, jetzt geht es um eine andere Geschichte:
Ich möcht im AppData-Verzeichnis in einem Unterordner vom Dosprogramm aus etwas abspeichern. Problem ist nur, ich habe nur einen Verzeichnisnamen, der nicht nach der 8.3 Regel ist. Nun muss ich die Angabe in 8.3 konvertieren. Hier und vielerorts habe ich nur spartanisch etwas gefunden. Hier der
Link zu meinem Fund.
Geschnitzt habe ich dann diesen Code draus:
Delphi-Quellcode:
{$IFNDEF Win32}
function LongPathToShortPath(aPath : ShortString):ShortString;
var
s :
string;
reg : Registers;
begin
aPath := aPath + #0;
FillChar(s, 255, #0);
s[0] := #255;
FillChar(reg, SizeOf(reg), #0);
reg.AX := $7160;
reg.CL := $01;
{ 1: Canonicalize path/file name (all short) }
reg.DS := LongInt(@aPath[1])
shr 16;
reg.SI := LongInt(@aPath[1])
and $FFFF;
reg.ES := LongInt(@s[1])
shr 16;
reg.DI := LongInt(@s[1])
and $FFFF;
Intr($21, reg);
Delete(s, Pos(#0, s), 255);
LongPathToShortPath := s;
end;
function ShortPathToLongPath(aPath : ShortString):ShortString;
var
s :
string;
reg : Registers;
begin
aPath := aPath + #0;
FillChar(s, 255, #0);
s[0] := #255;
FillChar(reg, SizeOf(reg), #0);
reg.AX := $7160;
reg.CL := $02;
{ Canonicalize path/file name (all long) }
reg.DS := LongInt(@aPath[1])
shr 16;
reg.SI := LongInt(@aPath[1])
and $FFFF;
reg.ES := LongInt(@s[1])
shr 16;
reg.DI := LongInt(@s[1])
and $FFFF;
Intr($21, reg);
Delete(s, Pos(#0, s), 255);
ShortPathToLongPath := s;
end;
{$ENDIF}
Falls jemand etwas zum Thema LFN - "Long File Name" sucht, hat er hier etwas zu finden.