Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi FS-Dateinamen in DOS-Dateinamen (https://www.delphipraxis.net/73746-fs-dateinamen-dos-dateinamen.html)

peanut 23. Jul 2006 14:05


FS-Dateinamen in DOS-Dateinamen
 
Hallo,

gibt es eine Funktion, mit der man Dateinamen des Mount-Managers in DOS-Dateinamen inkl. Laufwerksbezeichnung wandeln kann?

Beispielsweise sollte

\Device\HarddiskVolume1\Programme\Test123\test.exe

in

c:\Programme\Test123\test.exe

formatiert werden.

Gruß peanut.

Klaus01 23. Jul 2006 15:38

Re: FS-Dateinamen in DOS-Dateinamen
 
Delphi-Quellcode:
type
  TReplaceFlags = set of (rfReplaceAll, rfIgnoreCase);
function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string;
damit sollte das Problem eigentlich zu erschlagen sein.

Grüße
Klaus

himitsu 24. Jul 2006 12:51

Re: FS-Dateinamen in DOS-Dateinamen
 
Der normale DOSName wäre aber sowas C:\PROGRA~1\TEST123\TEST.EXE

Für soeine Angabe gibt's glaub ich 'ne WinAPI:
\\.\PhysicalDrive1\Programme\Test123\test.exe

's ließe sich ja leicht in diese Angabe umstellen (die DriveNummer sollte jedenfalls übereinstimmen) ... aber die entsprechende API müßte ich mal suchen (hatte sie nur mal kurz gesehn und da ich sie nicht brauchte erstmal ignoriert ._.


also theoretisch sollte es dann gehn, wenn du
'\Device\HarddiskVolume' durch '\\.\PhysicalDrive' ersetzt
und dann über die WinAPI dir den anderen Pfad geben ließest.
Aber wie gesagt ... keine ahnung, ob ich's wiederfinde ... 's hat sich ja nnur irgendwo im "kleinen" PSDK verstekt.

peanut 24. Jul 2006 16:00

Re: FS-Dateinamen in DOS-Dateinamen
 
Zitat:

Zitat von himitsu
Der normale DOSName wäre aber sowas C:\PROGRA~1\TEST123\TEST.EXE

Mit Dos meinte ich nicht die kurzen Dateinamen von MS-DOS, sondern die Umsetzung auf die Namenskonvention, die unter MS-DOS verwendet wurde => c:\... für \Device\HarddiskVolume1\...

peanut 28. Jul 2006 16:06

Re: FS-Dateinamen in DOS-Dateinamen
 
Hallo,

vielleicht kann das ja noch jemand gebrauchen:

Delphi-Quellcode:
  function QueryDosDeviceA(lpDeviceName, lpTargetPath: LPCTSTR; ucchMax: DWORD): DWORD; stdcall; external 'kernel32.dll';

  sBuffer: String;
  sDrive : String;
  dwDummy: DWORD;

  sDrive := 'A:'; sDrive[1] := #64;
  repeat
    inc(sDrive[1]);
    ZeroMemory(@sBuffer[1], Length(sBuffer));
    dwDummy := QueryDosDeviceA(@sDrive[1], @sBuffer[1], Length(sBuffer));
    if (dwDummy <> 0) then
      writeln(sDrive + ' = ' + Trim(sBuffer));
  until (sDrive[1] = 'Z');
Mit diesem Code kann man dann das mapping zu Fuß erledigen.

himitsu 1. Aug 2006 12:14

Re: FS-Dateinamen in DOS-Dateinamen
 
Hätte beinah gesagt, daß dieses bei mir nicht läuft,

aber wenn sBuffer zozusagen nicht vorhanden ist, dann wars ja och kein Wunder.

Also entweder vor der Schleife ein SetLength einfügen, :zwinker:
Delphi-Quellcode:
SetLength(sBuffer, MAX_PATH);

oder sBuffer anders definieren:
Delphi-Quellcode:
sBuffer: Array[0..MAX_PATH] of Char;
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, Windows;

var
  sDrive : String;
  sBuffer: Array[0..MAX_PATH-1] of Char;

begin
  sDrive := 'A:';
  repeat
    inc(sDrive[1]);
    if QueryDosDevice(@sDrive[1], @sBuffer, MAX_PATH) > 0 then
      writeln(sDrive + ' = ' + Trim(sBuffer));
  until (sDrive[1] = 'Z');
  readln;
end.
PS:
QueryDosDevice ist in der Windows-Unit (zumindestens hier in D7) definiert :)
und sDrive[1] := #64; brauchst du nicht nochmal zu definieren, denn #64 ist ja das 'A' und somit schon vorhanden ;)

Hab's gefunden:
GetVolumePathName
und es funktioniert sogar mit direkt deinem Pfad :)

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, windows;

function GetVolumePathName(lpszFileName: LPCTSTR; lpszVolumePathName: LPTSTR; cchBufferLength: DWORD): BOOL; stdcall;
  external 'kernel32.dll' name 'GetVolumePathNameA';

var
  sDrive : String;
  sBuffer: Array[0..MAX_PATH-1] of Char;

begin
  sDrive := '\Device\HarddiskVolume0';
  if GetVolumePathName(@sDrive[1], @sBuffer, MAX_PATH) then
    writeln(Trim(sBuffer))
  else
    writeln('ERROR');
  readln;
end.

Luckie 1. Aug 2006 12:56

Re: FS-Dateinamen in DOS-Dateinamen
 
Man beachte aber:
Zitat:

Requires Windows Vista, Windows XP, or Windows 2000 Professional.
Will man abwärtskompatibel bleiben, sollte man diese Funktion also dynamisch laden.

peanut 1. Aug 2006 17:02

Re: FS-Dateinamen in DOS-Dateinamen
 
Hi!

Zitat:

Zitat von himitsu
Also entweder vor der Schleife ein SetLength einfügen,
Delphi-Quellcode:
SetLength(sBuffer, MAX_PATH);

Ok, das kam vom Copy&Paste. Ich wollte den Quellcode fürs Forum etwas kürzen, dabei ist das dann wohl flöten gegangen :-)

Delphi-Quellcode:
  sDrive := 'A:'; sDrive[1] := #64;
Das ist nicht falsch, nur umständlich programmiert. Eigentlich hätte ich sDrive := '@:' schreiben müssen. Schöner wäre inc(sDrive[1]) vor until gewesen, ich gebe es zu :stupid: ...

Delphi-Quellcode:
function GetFullPathNameA(lpFileName: LPCTSTR; nBufferLength: DWORD; lpBuffer: LPTSTR; lpFilePart: LPTSTR): DWORD; stdcall; external 'kernel32.dll';
Diese Funktion hatte ich bei meiner Suche auch gefunden. Klappt nicht auf anderen Partitionen. Gibt man beispielsweise "device\harddiskvolume2\cmd.exe" (d:\cmd.exe) als ersten Parameter an, so liefert die Funktion stets das root-Verzeichnis, wie in der MSDN beschrieben... In meinem Falle ist das "c:\". Trotzdem danke für den Hinweis.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 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