Entwickler-Ecke

Windows API - Dateipfade konvertieren


Boldar - Di 28.07.09 14:26
Titel: Dateipfade konvertieren
Hi,
ich stelle jetzt mal hier eine Frage, die Mich schon lange beschäftigt:
ich habe in irgendeiner Codesammlung (ich glaube von den Schweizern) diese funktion gefunden:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
function GetFileNameFromHandle(hFile: Cardinal) : PChar;
var
hFileMap: Cardinal;
pMem: Pointer;
FileName: array[0..MAX_PATH] of char;
begin
  hFileMap:=CreateFileMapping(hFile, nil, PAGE_READONLY, 01nil);
  if hfilemap=0 then
  begin
    result := '';
    exit;
  end;
  pMem:=MapViewOfFile(hFileMap, FILE_MAP_READ, 001);
  if pmem=nil then
  begin
    result := '';
    CloseHandle(hFileMap);
    exit;
  end;
  if getcurrentprocess=0 then
  begin
    result := '';
    exit;
  end;
  GetMappedFileName(GetCurrentProcess, pMem, FileName, MAX_PATH);
  result:=FileName;
  UnmapViewOfFile(pMem);
  CloseHandle(hFileMap);
end;


Die benutze ich, um Dateipfade aus dem Filehandle zu bekommen.
Jedoch bekomme ich ausgaben in Form von

Quelltext
1:
\Device\HarddiskVolume1\Dokumente und Einstellungen\xxxxx\Anwendungsdaten\Mozilla\Firefox\Profiles\xxxxxx\cookies.sqlite-journal740                    


Woher kommt dass und wie konvertiert man das in "Richtige" Dateipfade??
Und Woher kommt die Zahl am Ende?
mfg Boldar


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Di 28.07.2009 um 14:45


BenBE - Di 28.07.09 14:29

Das sind sogenannte Hardware-Pfade, da Windows intern nämlich analog zu Linux mit einem einzigen virtuellen Dateibaum arbeitet, statt wie DOS jedes Laufwerk einzeln zu betrachten.

Zum Konvertieren dieser Pfade müsstest Du dir durch Weglassen der einzelnen Pfadkomponenten und Abfrage der API nach den Mountpoints (theoretisch ginge Registry, das wäre aber unsauber und Fehleranfällig) den Pfad wieder ummappen.


Boldar - Di 28.07.09 14:40

Da eine Schnelle Suche bei Google nichts brachte: kannst du mir die entsprechenden api-Funktionen verraten?
*Liebfrag*
:flehan:
mfg Boldar


BenBE - Di 28.07.09 14:53

Siehe http://msdn.microsoft.com/en-us/library/aa364215(VS.85).aspx Der Rest sollte sich davon ausgehend finden.


Delete - Di 28.07.09 14:56

Ich hätte eher auf http://msdn.microsoft.com/en-us/library/aa365730(VS.85).aspx getippt.


ffgorcky - Di 28.07.09 14:57

Also ich habe auch einfach mal danach in Google gesucht [http://www.google.de/search?hl=de&ie=ISO-8859-1&q=harddiskvolume1+delphi] und dort klingt doch gleich der erste Treffer [http://www.programmingforums.org/post35543.html] gut - oder?

Sieh das jetzt aber bitte nicht als Kritik!
Ich habe von dem Thema leider noch überhaupt keine Ahnung!...


BenBE - Di 28.07.09 14:58

Jap, bzw.:
http://msdn.microsoft.com/en-us/library/aa363940(VS.85).aspx


AHT - Fr 31.07.09 17:54

user profile iconffgorcky hat folgendes geschrieben Zum zitierten Posting springen:
Also ich habe auch einfach mal danach in Google gesucht [http://www.google.de/search?hl=de&ie=ISO-8859-1&q=harddiskvolume1+delphi] und dort klingt doch gleich der erste Treffer [http://www.programmingforums.org/post35543.html] gut - oder?

Sieh das jetzt aber bitte nicht als Kritik!
Ich habe von dem Thema leider noch überhaupt keine Ahnung!...

Geht, soweit ich weiß, aber erst ab XP.
Da gibt es noch QueryDosDevice und eine Möglichkeit über native API.


SAiBOT - Fr 31.07.09 19:46


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
// DosName-Format: "\Device\HarddiskVolume2"; LogicalName-Format: "X:\"
function DosNameToLogical(DosName:Stringvar LogicalName:String):Boolean;
var
  r,r2:String;
begin
  Result := False;
  SetLength(r, MAX_PATH+1);
  SetLength(r2, MAX_PATH+1);

  GetLogicalDriveStringsW(MAX_PATH, @r[1]);
  while pos('\', r) > 0 do
  begin
    r[3] := #00;
    QueryDosDeviceW(@r[1], @r2[1], MAX_PATH);
    if CompareMem(@r2[1], @DosName[1], Length(DosName)*SizeOf(Char))  then
    begin
      LogicalName := r[1]+':\';
      Result := True;
      break;
    end;
    Delete(r, 14);
  end;
end;


Hab' das vor einiger Zeit auch mal gemacht, ist aber ein wenig "dirty" die Funktion, schreib sie halt um :).
(ACHTUNG WIDESTRING)