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, 0, 1, nil); if hfilemap=0 then begin result := ''; exit; end; pMem:=MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 1); 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
Narses: 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
AHT - Fr 31.07.09 17:54
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:
| function DosNameToLogical(DosName:String; var 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, 1, 4); end; end; |
Hab' das vor einiger Zeit auch mal gemacht, ist aber ein wenig "dirty" die Funktion, schreib sie halt um :).
(ACHTUNG WIDESTRING)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!