![]() |
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. |
Re: FS-Dateinamen in DOS-Dateinamen
Delphi-Quellcode:
damit sollte das Problem eigentlich zu erschlagen sein.
type
TReplaceFlags = set of (rfReplaceAll, rfIgnoreCase); function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string; Grüße Klaus |
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. |
Re: FS-Dateinamen in DOS-Dateinamen
Zitat:
|
Re: FS-Dateinamen in DOS-Dateinamen
Hallo,
vielleicht kann das ja noch jemand gebrauchen:
Delphi-Quellcode:
Mit diesem Code kann man dann das mapping zu Fuß erledigen.
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'); |
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:
PS:
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. 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: ![]() 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. |
Re: FS-Dateinamen in DOS-Dateinamen
Man beachte aber:
Zitat:
|
Re: FS-Dateinamen in DOS-Dateinamen
Hi!
Zitat:
Delphi-Quellcode:
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: ...
sDrive := 'A:'; sDrive[1] := #64;
Delphi-Quellcode:
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.
function GetFullPathNameA(lpFileName: LPCTSTR; nBufferLength: DWORD; lpBuffer: LPTSTR; lpFilePart: LPTSTR): DWORD; stdcall; external 'kernel32.dll';
|
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