C++ Dateieigenschaften auslesen

hemmoleg

Ensign
Registriert
Mai 2008
Beiträge
177
moin,

wie der titel schon sasgt will ich die erweiterten eigenschaften (Titel, Thema, Bewertung...) einer datei auslesen. Auf die datei zugreifen kann ich schon, nur fehlt mir quasi ne funktion die mir eben die eigenschaften liefert.
hat da jemand mal n tipp für mich?
 
GetFileAttributesEx

e: alles andere wirst du wohl nur über selbst geschriebene parser bzw. com-objekte bekommen. sachen wie titel, sind (bei mp3s z.b.) nämlich nix weiter als id3-tags. genauso wird in einem office objekt explizit der autor u.ä. angegeben.
 
Zuletzt bearbeitet:
in meinem fall handelt es sich um .tif dateien. leider komm ich mit der funktion nich ganz zu recht. ich weiß halt nich so richtig was ich da für die parameter einsetzen soll und bei dem beispiel dazu blick ich überhaupt nich durch. kanns du mit vlt mal erklären was ich für die einzelnen parameter einsetzen soll?
 
bei bildern musst du die iptc daten auslesen. auf codeproject gibts dazu ein beispiel an einer jpeg. am einfachsten wäre es, wenn du dir irgendwoher nen iptc reader/metadaten reader suchst und über diesen die informationen ausliest. irgendwo wirds im internet sicher was dazu geben. vllt hilft dir das ja schon weiter (schnell über google gefunden).
 
irgendwie find ich das alles recht umständlich, ausserdem denke ich das informationen wie titel und thema nicht exclusiv bildern vorbehalten sind. das muss doch einfacher gehen.
 
mmhh naja also ich hab jetz schon n vb script gefunden:

Code:
Dim arrHeaders(35)
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace("C:\Scripts")
For i = 0 to 34
 arrHeaders(i) = objFolder.GetDetailsOf(objFolder.Items, i)
Next
For Each strFileName in objFolder.Items
 For i = 0 to 34
 Wscript.Echo i & vbtab & arrHeaders(i) _
 & ": " & objFolder.GetDetailsOf(strFileName, i)
 Next
Next

aber leider hab ich überhaupt keine ahnung von vb. wenn ich nun jedenfalls n neues vb-projekt erstelle und den code da einfach reinkopiere gehts schon mal damit los das "set" garnich da steht weil das ja irgendwie nich mehr unterstützt wird. aber ichw weiß auch nich was ich da machen soll. also wärs echt super wenn mir da jemand helfen könnte.

bzw. bin ich nach wie vor offen für die lösung mit der GetFileAttributesEx-methode wenn mit jemand die parameter erklärt.
 
Zuletzt bearbeitet:
Wieso soll DIR jemand die Parameter erklären? In dem Link von claW. stehen doch die Erklärungen für die Parameter drinne! wenn man programmieren will, sollte man auch etwas Initiative zeigen und sich selber was raussuchen wenn man was nicht auf anhieb weiß.
 
prizipiell würd ich mir ja auch was suchen, aber leider sind die erklärungen von ms so kryptisch für mich das ich sie überhaupt nicht verstehe. ausserdem will ich hier auch kein ganzes programm. höchstens mal n beispielcode der mir die bedeutung der parameter deutlicher vor augen fürht.
 
Ganz ehrlich? Das ist Bullshit! Die Erklärungen sind doch völlig eindeutig auf der Seite.

lpFileName [in] = Das File oder das Directory was du untersuchen willst.
fInfoLevelId [in] = Die Attribute informationen die du erhalten willst.(http://msdn.microsoft.com/en-us/library/bb736257(v=VS.85).aspx)
lpFileInformation = ein Zeiger auf nen Buffer wo die erhaltenen Informationen rein sollen.

Was war daran jetzt so schwer!?
 
hemmoleg schrieb:
bzw. bin ich nach wie vor offen für die lösung mit der GetFileAttributesEx-methode wenn mit jemand die parameter erklärt.
ein wenig eigeninitiative kannst du aber auch an den tag legen. naja... woraus wirst du denn nicht schlau? die funktion ist bei weitem nicht komplex und schwer zu implementieren ist es auch nicht.
Code:
#include <iostream>
using namespace std;

#include <Windows.h>

#ifdef UNICODE
#define _S(x) L ## x
#else
#define _S(x) x
#endif

void dump( const WIN32_FILE_ATTRIBUTE_DATA *Data )
{
  cout << Data->dwFileAttributes << endl
       << Data->ftCreationTime.dwHighDateTime << endl
       << Data->ftLastAccessTime.dwHighDateTime << endl
       << Data->ftLastWriteTime.dwHighDateTime << endl
       << Data->nFileSizeHigh << endl
       << Data->nFileSizeLow << endl
       << endl;
}

int main( int argc, char **argv, char **env )
{
  LPCTSTR filename = _S("D:\\tf2.png");
  GET_FILEEX_INFO_LEVELS FileInfosLevel = (GET_FILEEX_INFO_LEVELS)0;
  WIN32_FILE_ATTRIBUTE_DATA InfoFile;

  BOOL r = ::GetFileAttributesEx( filename, FileInfosLevel, &InfoFile );

  if( r != NULL )
    dump( &InfoFile );
  else
    cout << "failed" << endl;

  system( "pause" );
  return EXIT_SUCCESS;
}
und für den rest: http://msdn.microsoft.com/en-us/library/dcw63t7z(VS.85).aspx du musst dir halt beim programmieren alles irgendwie zusammensuchen. du bekommst bei weitem nie irgendwas fertiges, sondern nur kleine häppchen, die du selbst zusammenbasteln musst.
 
also erstma n großes danke an claW für den code! mein hauptproblem war das ich mit den datentypen nich klargekommen bin weil ich noch nie was von denen gehört hab (ich hatte bisher immer nur mit int, double, string... zu tun). die haben mich halt total verwirrt und LPVOID wird in der msdn zB gar nich erklärt. bzw das hauptproblem ist und bleibt das ich bisher sehr wenig mit der msdn zu tun hatte und die sich eindeutig an profis richtet. ausserdem isses sehr frusttierend wenn man über eine stunde im internet nach nem beispielcode wie dem von claW sucht und dann keinen findet.
 
hemmoleg schrieb:
mein hauptproblem war das ich mit den datentypen nich klargekommen bin weil ich noch nie was von denen gehört hab (ich hatte bisher immer nur mit int, double, string... zu tun). die haben mich halt total verwirrt und LPVOID wird in der msdn zB gar nich erklärt.
wie gesagt: recht-sklick (alternativ strg + klick oder [strg +] f12) auf den dateitypen und schon weißt du was das bedeutet.

lp heißt im prinzip nur, dass der typ ein zeiger ist, mit dem datentyp der dahinter steht. also lpvoid z.b. long pointer auf void (im klartext void *). lpctstr/lpcwstr long pointer auf const (wide) string (da string im klassischen sinne nicht existiert, hier halt const char * bzw. const wchar_t * in unicode umgebungen).

edit: spätestens wenn du plattformübergreifend programmieren willst, brauchst du solche typedefs, damit du nicht alles 100 mal schreiben musst. da käme dann z.b. so ein konstrukt heraus:
Code:
#if defined(VISUAL_STUDIO) || defined(MINGW)
typedef char int8;
typedef unsigned char uint8;
typedef short int16;
typedef unsigned short uint16;
typedef long int32;
typedef unsigned long uint32;
typedef long long int64;
typedef unsigned long long uint64;
#elif defined(...)
...
#endif
ist imo auch weit übersichtlicher, als wenn du die ganze zeit mit char, short, int usw. rumhantierst. irgendwann magst du dann vllt nicht mehr durchsehen. ich persönlich nutz da lieber ein int16 o.ä., da weiß man sofort um was es sich handelt und wie groß der typ ist bzw. wie weit der wertebereich geht.

dann gibts natürlich noch andere sachen wie dword, was aber etwas mit wörtern zu tun hat. das rührt vom byte her. ein byte kennst du ja sicherlich (= 8 bit = größe eines char). ein wort ist ein "doppeltes" byte (= 16 bit = größes eines short). ein dword ist ein doppeltes wort (= 32 byte = int). und dann gibts noch das qword (= quad word), was die größe eines long long (je nach compiler) bzw. __int64 besitzt (= 64 bit). die größen kannst du aber auch ganz leicht einsehen, wenn du den taschenrechner aufmachst, auf die programmierersicht wechselst und unten erhälst du dann die anzeige qword, dword, word und byte. wie groß das alles dann ist, siehst du unter der nummernanzeige.

irgendwo hier im forum gibts auch ne nette übersicht, was denn all dieses lpvoid, lpctstr usw. bedeutet, aber die erklärung hier reicht eig schon für die meisten fälle.
hemmoleg schrieb:
bzw das hauptproblem ist und bleibt das ich bisher sehr wenig mit der msdn zu tun hatte und die sich eindeutig an profis richtet.
die msdn richtet sich an programmierer, weder an anfänger noch profi. es ist alles erklärt, alles von datentypen über beispiele für parameter, bis zu möglichen rückgabewerten und weiterführende funktionen. das ist nicht das problem. ein anfänger mag da vllt nich durchblicken, wenn man sich aber drauf konzentriert und kurz nachdenkt, ist die msdn überhaupt kein problem.
 
Zuletzt bearbeitet:
Zurück
Oben