Entwickler-Ecke
Windows API - Dateityp-bezeichnung auslesen
knightkiller - Fr 19.07.02 10:19
Titel: Dateityp-bezeichnung auslesen
Ich sollte eine Funktion haben, der man eine Dateiendung übergeben kann, und die mir dann die Bezeichnung zu der Datei zurückgibt.
also etwa so:
Quelltext
1: 2: 3: 4: 5:
| function GibDateibezeichnung(typ : String) : string; ... begin showmessage(GibDateibezeichnung('rar')); end; |
Dann sollte eine Mitteilung kommen: WinRAR-Archiv
Hat jemand eine Ahnung, wie ich zu diesen Informationen komme?
Delete - Fr 19.07.02 10:54
Hi.
Eine API-Funktion ist mir im Augenblick nicht bekannt (ist aber eine interessante Frage :-)), für´s Erste wäre daher mein Vorschlag, dass du in der Registry selbst aktiv wirst.
Mit anderen Worten:
1. HKEY_CLASSES_ROOT öffnen und nach der Endung, z.B. .rar, suchen. (Der Punkt vor der Endung ist in dem Fall wichtig!)
2. Den Default-String auslesen, der dann auf den Dateityp zeigt; in dem Fall WinRar.
3. Diesen Schlüssel öffnen (ist ebenfalls in HKCR), und auch hier den Default-String auslesen. Und -voilá- du hast die Bezeichnung. Zur Sicherheit prüfst du noch, ob der String ein Leerstring ist und gibst in dem Fall vielleicht "Unbekannter Typ" zurück.
Ich gucke mal, ob´s vielleicht eine API-Funktion dafür gibt, mit der es möglicherweise leichter geht.
Gruß,
Mathias.
Delete - Fr 19.07.02 11:27
Als mögliche Alternative wäre die API-Funktion "SHGetFileInfo" (Unit ShellAPI.pas) zu nennen, der du den
kompletten Dateinamen und nicht nur die Endung übergibst. Hier mal die C-Deklaration aus dem PSDK:
Quelltext
1: 2: 3: 4: 5: 6: 7:
| DWORD_PTR SHGetFileInfo( LPCTSTR pszPath, // Dateiname DWORD dwFileAttributes, // kann hier Null sein SHFILEINFO* psfi, // Variable vom Typ TSHFileInfo UINT cbFileInfo, // Größe dieser Variable (sizeof()) UINT uFlags // SHGFI_TYPENAME ); |
Auf die Schnelle habe ich festgestellt, dass der Rückgabewert Eins ist, wenn die Sache funktioniert hat, bzw. Null, wenn die Datei z.B. nicht existiert. Rufst du die Funktion also auf, kannst du dir danach mit
Quelltext
1:
| ShowMessage(shi.szTypeName); |
ebenfalls die Typenbezeichnung anzeigen lassen. "shi" ist meine TSHFileInfo-Variable, und: Nein, ich habe kein T am Ende vergessen. :wink:
knightkiller - Fr 19.07.02 11:41
habe den Dateiname nicht, nur die Endung...
aber ich habe mal in der Zwischenzeit etwas mit der Registry gebastelt, funktioniert aber nicht... (reg.ReadString('(Standard)') liefert IMMER '' zurück?!)
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: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
| function TFrmMain.GetFileType(Typ : String) : String; var reg : TRegistry; std : String; begin reg := TRegistry.Create; std := Uppercase(typ)+'-Datei'; try reg.RootKey := HKEY_CLASSES_ROOT;
if Typ = 'xxx' then begin Result := 'Unbekannte Datei'; FreeAndNil(reg); exit; end;
if not reg.KeyExists('.'+typ) then begin Result := std; FreeAndNil(reg); exit; end;
if not Reg.OpenKey('\.'+typ,false) then begin Result := std; FreeAndNil(reg); exit; end;
if reg.ReadString('(Standard)') = '' then begin Result := std; FreeAndNil(reg); exit; end else begin Result := reg.ReadString('(Standard)'); FreeAndNil(reg); exit; end;
except Result := std; if reg <> nil then FreeAndNil(reg); end;
end; |
Delete - Fr 19.07.02 14:53
Weil es
(Standard) in diesem Sinn nicht gibt! Du müsstest einfach einen Leerstring übergeben:
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: 30: 31: 32: 33: 34:
| function TFrmMain.GetFileType(Typ : String) : String; var reg : TRegistry; std : String; begin // Standardrückgabe Result := 'Unbekannter Typ';
// falls erforderlich, Punkt ergänzen if(Typ[1] <> '.') then Typ := '.' + Typ;
reg := TRegistry.Create; with reg do try RootKey := HKEY_CLASSES_ROOT; if(OpenKey(Typ,false)) then begin std := ReadString(''); CloseKey;
if(std <> '') then if(OpenKey(std,false)) then begin std := ReadString(''); CloseKey; if(std <> '') then Result := std; end; end; finally Free; end; end; |
knightkiller - Fr 19.07.02 15:20
voll geil jetzt funktionierts! :D vielen Dank!
Delete - Fr 19.07.02 17:31
Vielleicht solltest du noch folgendes bedenken (hab´ ich vorhin leider vergessen):
Standardmäßig wird die Registry mit "KEY_ALL_ACCESS" geöffnet. Das schließt Lese- und Schreibrechte ein. Und genau das kann auf NT-Systemen zu Problemen führen, denn
HKEY_CLASSES_ROOT ist auch einer von den Schlüsseln, auf die nicht jeder Benutzer vollen Zugriff hat.
Selbst wenn du kein NT, 2000 oder XP hast - vielleicht benutzt es ein anderer auf so einem System. Und wenn derjenige dann noch eingeschränkte Rechte hat und kein Admin ist, sieht er immer nur "Unbekannter Dateityp" als Ergebnis und wird entsprechend "sauer" sein.
Lösung - Du öffnest die Registry so:
Quelltext
1:
| reg := TRegistry.Create(KEY_QUERY_VALUE); |
Dann klappt´s auch mit weniger Benutzerrechten, und das Programm zeigt ordnungsgemäß die Beschreibung an.
Mathias.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!