Datei Infos- und Symbol auslesen
-
Hallo ich hab folgendes Problem:
Ich würde gern die Datei Informationen wie "Erstellungsdatum"... auslesen.
Außerdem würde ich gern auch noch das Symbol auslesen.
(Die Symbolnummer und die Standardsymbole kann ich auslesen aber Nummer und Symbol passten nicht zusammen!)
Kann mir jemand hlefen?
Gruß KY
-
zu Datei-Infos:
entweder mit den VCL-Funktionen "FileGetDate" bzw "FileAge"
oder mit der C-Funktion "_stat" (<sys/types.h> und <sys/stat.h> einbinden)
oder mit der WinAPI-Funktion "GetFileTime".Weitere Dateiinfos (Datei-Attribute) können entsprechend mit den verwandten Funktionen "FileGetAttr" bzw "GetFileAttr" ermittelt werden.
zu Symbol:
wie liest du denn diese Infos aus?
-
des mit den datei infos ist schon mal cool!
SHFILEINFO sfi; SHGetFileInfo(Suche.Name.c_str(), FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES); files->Items->Item[files->Items->Count-1]->ImageIndex=sfi.iIcon;So bekomme ich die Nr.
void TfmMain::FillImageList(const String & FileName, TImageList *il) { int AnzahlIcons = int(ExtractIcon(fmMain->Handle, FileName.c_str(), -1) ); if (AnzahlIcons != NULL) { TIcon *MyIcon = new TIcon(); for (int i=0;i<AnzahlIcons;i++) { MyIcon->Handle = ExtractIcon(fmMain->Handle,FileName.c_str(),i); il->AddIcon(MyIcon); } } }und so fülle ich meine image list mit bildern!
Nur leider passen die Icons nicht zu den Nr.
-
Ich glaube, die zwei Funktionen 'SHGetFileInfo' und 'ExtractIcon' passen nicht zueinander.
Wenn du das Standard-Icon einer Anwendung haben willst, nimm einfach das Icon mit der Nummer 0 (Null), alsoMyIcon->Handle = ExtractIcon(fmMain->Handle,FileName.c_str(), 0);
-
ok des funktioniert schon richtig gut!
jetzt hab ich aber folgendes problem:
Ich lese zum beispiel das icon fürs notepad aus.
Das funktioniert da das Icon für die notepad.exe in der exe gespeichert ist.
aber zb bei einer txt datei wird dann auch des icon aus der notepad.exe genommen statt des standart icon aus der shell32.dll
woher weiß ich welches icon aus der shell32.dll ich für ne txt datei nehmen muss?
Gruß KY
-
-
cool genau des richtige!!!
danke akari
-
Damit hab ich mich auch beschäftigt, als ich ein ZIP Programm geschrieben hab.
Hab da mal eine kleine Hilfsfunktion geschrieben die genau dies macht.
Sie liest das Icon einer Datei ein, schreibt es in eine Imagelist und liefert den Index zurück. Sollte eine datei nicht existieren legt sie sie einfach an, holt sich dann das Icon und löscht sie wieder.Evtl ist diese Funktion ja eine kleine Hilfe für manche, darum Poste ich einfach mal den Code.
/*Die Funktion ermittelt das Icon einer Datei Input-Parameter: const AnsiString & sFileName_i: Referenz auf den Dateiname der Datei, von welcher man das Icon möchte ( Optional mit oder ohne Pfad ) vector< AnsiString > & oExtensionList_i: Referenz auf den Vector, welcher bereits benutzte Dateiendungen ( doc, exe, ... )speichert -> Wird wärend der Funktion befüllt TImageList & oImageList_i : Referenz auf die ImageList, welche die Icons abspeichert -> Wird wärend der Funktion befüllt const AnsiString & sExeDir_i: (Optional, wenn der Pfad in sFileName_i steht) Referenz auf den Pfad, in dem die Datei liegt, bzw wo sie temporär angelegt wird ( z.B. bei ZIP Archiven, bei denen die Dateien noch nicht existieren, müssen sie temporär angelegt werden) HINWEIS: Bitte darauf achten, dass oExtensionList_i und oImageList_i AUSSCHLIESSLICH von dieser Funktion gefüllt werden, da sie Synchron arbeiten müssen! Rückgabewert: Index des Icons in oImageList_i bzw. -1 bei einem Fehler */ int getIcon( const AnsiString & sFileName_i, vector< AnsiString > & oExtensionList_i, TImageList & oImageList_i, const AnsiString & sExeDir_i = "" ) { //sFileName_i muss einen Wert haben assert( !sFileName_i.IsEmpty() ); //Wenn sFileName_i nur den Dateinamen+Dateiendung enthält //wird als Datei-Pfad sExeDir_i genommen AnsiString sTempFile; if( sFileName_i.LastDelimiter("\\") > 0 ){ sTempFile = sFileName_i; } else{ assert( !sExeDir_i.IsEmpty() ); sTempFile = sExeDir_i + "\\" + sFileName_i; } //Die Dateiendung ( z.B. doc, exe ) wird sExtension zugewiesen AnsiString sExtension = sFileName_i.SubString( sFileName_i.LastDelimiter(".")+1, sFileName_i.Length() - sFileName_i.LastDelimiter(".")); //Es wird geprüft ob in oExtensionList_i die Dateiendung sExtension existiert //Wenn sie existiert, wird der Index zurückgegeben for( unsigned int i = 0; i < oExtensionList_i.size(); i++ ){ if( oExtensionList_i[i] == sExtension ){ return i; } } //Überprüfung ob die Datei existiert bool bFileExists = FileExists( sTempFile ); //sollte die datei nicht existieren, wird eine Temporäre Datei mit der //selben Endung angelegt if( !bFileExists ){ ofstream oFile( sTempFile.c_str() ); oFile.close(); } //das Handle des Icons wir ermittelt TIcon *MyIcon = new TIcon(); WORD wTemp; HICON h = ExtractAssociatedIcon(Application->Handle,sTempFile.c_str(),&wTemp); //Sollte das Handle ungültig sein wird -1 zurückgegeben if( !h ) return -1; //Sonst wird das Icon in oImageList_i aufgenommen MyIcon->Handle = h; oImageList_i.AddIcon(MyIcon); //und die Dateiendung in oExtensionList_i oExtensionList_i.push_back( sExtension ); //sollte die Datei nur Temporär angelegt worden sein, wird sie gelöscht if( !bFileExists ){ remove( sTempFile.c_str() ); } //der Index des Icons wird zurückgeliefert return oImageList_i.Count - 1; }Gruß FightingWolf