Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DOS und lange Dateinamen (https://www.delphipraxis.net/174540-dos-und-lange-dateinamen.html)

MacGuyver 27. Apr 2013 21:10

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 (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.

zeras 28. Apr 2013 08:38

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.

sx2008 28. Apr 2013 09:31

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 MSDN-Library durchsuchenGetShortPathName() und MSDN-Library durchsuchenGetLongPathName().

Zum Glück ist GetShortPathName() in der Delphi RTL schon gebrauchsfähig verpackt:
Delphi-Quellcode:
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;
Anscheinend gibt es ExtractLogPathName() in der RTL nicht, aber du hast ja jetzt die Vorlage und braucht nur "Short" durch "Long" ersetzen.

Delphi-Laie 28. Apr 2013 09:43

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.

dummzeuch 28. Apr 2013 11:30

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:

http://www-user.tu-chemnitz.de/~heha...hat_lfn.de.htm

Vielleicht hilft das ja irgendwie?


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz