AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DOS und lange Dateinamen

Ein Thema von MacGuyver · begonnen am 27. Apr 2013 · letzter Beitrag vom 28. Apr 2013
Antwort Antwort
Benutzerbild von MacGuyver
MacGuyver

Registriert seit: 9. Sep 2003
Ort: Wildeshausen
295 Beiträge
 
Turbo Delphi für Win32
 
#1

DOS und lange Dateinamen

  Alt 27. Apr 2013, 22:10
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.
Englisch eine Weltsprache? Zu kompliziert und der nahe Osten würde Englisch als Pflichtweltsprache nicht akzeptieren.
IDO wäre genau das Richtige: http://forum.idolinguo.de/index.php oder www.idolinguo.de
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.633 Beiträge
 
Delphi 12 Athens
 
#2

AW: DOS und lange Dateinamen

  Alt 28. Apr 2013, 09:38
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.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#3

AW: DOS und lange Dateinamen

  Alt 28. Apr 2013, 10:31
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.
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#4

AW: DOS und lange Dateinamen

  Alt 28. Apr 2013, 10:43
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.

Geändert von Delphi-Laie (28. Apr 2013 um 10:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.604 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: DOS und lange Dateinamen

  Alt 28. Apr 2013, 12:30
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?
Thomas Mueller
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:58 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