![]() |
DOS und lange Dateinamen
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 (
![]() 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 ![]() Geschnitzt habe ich dann diesen Code draus:
Delphi-Quellcode:
Falls jemand etwas zum Thema LFN - "Long File Name" sucht, hat er hier etwas zu finden.
{$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} |
AW: DOS und lange Dateinamen
Hallo,
vielleicht hilft dir die Funktion ExtractShortPathName etwas. Die benutze ich, wenn ich ein DOS Programm mit Parameter starten will, welche beipielsweise im Benutzerordner liegt. |
AW: DOS und lange Dateinamen
Also die Pfad- und Dateinamen selbst umzuwandeln geht ja mal gar nicht.
Dafür gibt es die Windows-API-Funktionen ![]() ![]() Zum Glück ist GetShortPathName() in der Delphi RTL schon gebrauchsfähig verpackt:
Delphi-Quellcode:
Anscheinend gibt es ExtractLogPathName() in der RTL nicht, aber du hast ja jetzt die Vorlage und braucht nur "Short" durch "Long" ersetzen.
function ExtractShortPathName(const FileName: string): string;
var Buffer: array[0..MAX_PATH - 1] of Char; begin SetString(Result, Buffer, GetShortPathName(PChar(FileName), Buffer, SizeOf(Buffer))); end; |
AW: DOS und lange Dateinamen
Wolfgang Wirths Artikel ist mir auch noch wohlbekannt, ich assoziierte ihn sofort und hätte ihn herausgesucht und verlinkt.
Die langen Verzeichnis- und Dateinamen ab DOS 7.0 unter DOS waren letztlich nur in der DOS-Box verfügbar. Also mußte in der DOS-Box ein zusätzlicher Treiber verfügbar sein. Obwohl ich seinerzeit sehr interessiert diese "Szene" verfolgte, fand ich letztlich nicht eine einzige brauchbaren, funktionierende Lösung für dieses Problem in reinem DOS. Ja, ich weiß nicht einmal mehr, wieweit die Versprechen, das bereitzustellen, überhaupt gingen. Verstehen tue ich es nicht, weil die freie Programmiererszene ganz andere Herausforderungen schon erfolgreich anging, z.B. Treiber für NTFS. |
AW: DOS und lange Dateinamen
4DOS hatte, soweit ich mich erinnere, eine Funktion dafuer, die lange Dateinamen unter Windows bereitstellte. Leider hoert meine Erinnerung damit auch schon auf, gefunden dazu habe ich folgendes:
![]() Vielleicht hilft das ja irgendwie? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz