C++ WinAPI Datei-Details abfragen

MarkP

Lieutenant
Registriert
Jan. 2016
Beiträge
751
Ich arbeite daran mit nur API Befehlen Informationen über Dateien zu lesen.
Was ich schon habe ist,
zum einlesen der Partitionsdaten der Platte GetVolumeInformationW()
Verzeichnisse und Dateien finden mit FindFirstFile() und FindNextFile()
Dann ein bisschen Code um die gefundenen Dateien zu sortieren, Dateitypen nach der Endung sortieren, usw.

Wenn dabei eine Dateiendung .mp4 gefunden wird, will ich noch ein paar weitere Details zur Datei abfragen.

Dateigrösse mit GetFileSizeEx()

..... und dann stehe ich auf dem Schlauch, weil ich nicht weiss wie ich den nächsten Schritt machen soll.

Im Windows-Explorer kann man unter Ansicht - Details aus einer ellenlangen Liste von Details auswählen und auch wenn längst nicht alle Details für alle Dateien zur Verfügung stehen, Bildbreite und Bildhöhe, sprich die Auflösung eines Videos, zeigt der Windows-Explorer bei .mp4 Dateien korrekt an.
Ich müsste nur wissen, welcher API-Befehl diese Details liefert?

Blöderweise kann ich nicht mal Google oder MSDN fragen, weil ich nicht weiss, wie diese Details in englisch heissen.
 

Anhänge

  • explorer.jpg
    explorer.jpg
    114,5 KB · Aufrufe: 92
Trivial ist das Ermitteln von solchen Daten nicht.
Wenn es dir nur um Media-Dateien (Videos) geht, kannst du ja mal schauen, ob du ffmpeg-Code in deinen C++-Code integrieren kannst...

Und naja, Win32-API via C++ programmieren, da wird jemand schon genau wissen was er macht.
 
MarkP schrieb:
Im Windows-Explorer kann man unter Ansicht - Details aus einer ellenlangen Liste von Details auswählen und auch wenn längst nicht alle Details für alle Dateien zur Verfügung stehen, Bildbreite und Bildhöhe, sprich die Auflösung eines Videos, zeigt der Windows-Explorer bei .mp4 Dateien korrekt an.
Ich müsste nur wissen, welcher API-Befehl diese Details liefert?
Hier gibt es Beispielcode dazu:
https://github.com/microsoft/Window...ain/Samples/FileAccess/cppwinrt/Scenario6.cpp

C++:
BasicProperties basicProperties = co_await file.GetBasicPropertiesAsync();

hstring dateAccessProperty{ L"System.DateAccessed" };
hstring fileOwnerProperty{ L"System.FileOwner" };
IMap<hstring, IInspectable> extraProperties = co_await file.Properties().RetrievePropertiesAsync({ dateAccessProperty, fileOwnerProperty });
 
Zuletzt bearbeitet:
@tollertyp Nein, es geht mir nicht um Media-Dateien im Allgemeinen und es geht auch nicht um einen sauberen Code der immer und überall funktioniert, vielmehr brauche ich diesen einen API-Befehl genau EINmal und nur für mich selber, weil ich ein Verzeichnis mit über 1.000 Videos drin habe, alle .mp4, so ca. die Hälfte in 720p, die andere Hälfte in 1080p und keinen Bock habe die alle einzeln anzuschauen.
Darum will ich nur für diesen einen Zweck einen API-Befehl, der das ausliest und mir die Dateinamen aller Dateien ausgibt, nach 720p und 1080p getrennt.

@KitKat::new() Danke, schaut erstmal nach viel mehr aus als ich brauche, aber ich werde mir das mal näher anschauen.
 
  • Gefällt mir
Reaktionen: Tornhoof
@kartoffelpü Das kannte ich schon, nutzt mir aber nicht, schon alleine weil es viel zu viel Aufwand ist das in mein Winzig-Programm einzubinden.
Ich habe MediaInfo sogar bei mir installiert, aber der braucht eine halbe Ewigkeit um ein Verzeichnis mit über 1.000 Videos einzulesen, weil er halt zu jeder Datei Unmengen an Informationen einliest.
Ich habe aber gerade die kürzest mögliche Lösung gefunden, die mir Google dank dem Hinweis auf RetrievePropertiesAsync nebenbei geliefert hat.

https://learn.microsoft.com/en-us/u...leproperties.videoproperties?view=winrt-26100

Da sind es weniger als 10 Zeilen und liefert mir exakt was ich haben will.
Darum einen heissen Dank @KitKat::new() , auch wenn der Tipp nur auf Umwegen die Lösung gebracht hat.
 
Zuletzt bearbeitet:
Also auf gut deutsch: Du hast ein XY-Problem.

und warum fügst du die Spalte dann nicht im Explorer hinzu und sortierst danach?

Und jetzt muss es keine C++ Win32-API mehr sein?

Ich hab übrigens ein Tool geschrieben, das via ffmpeg und mkvinfo Meta-Informationen aus Videodateien ausliest und da bekomme ich dann auch genau solche Informationen und noch viel mehr... aber ist halt alles nicht die C++ Win32-API.
 
tollertyp schrieb:
warum fügst du die Spalte dann nicht im Explorer hinzu und sortierst danach?

Hast du mal in der Detailansicht vom Windows-Explorer versucht über 1.000 Videos durch zu scrollen? Vermutlich nicht.
Mein kleines Programm liest die Liste ein, schreibt genau die Daten die ich gerne hätte ohne weitere Extras in eine .csv Datei und die kann ich in Excel ganz drastisch viel leichter überblicken.
Alleine die Tatsache, dass der Windows-Explorer sich für jedes einzelne Verzeichnis separat und automatisch merkt welche Ansicht man zuletzt hatte, macht es für mich schon umständlich den Explorer zu nutzen, während ich in Excel beliebig rumsortieren und beim Schliessen einfach die Frage nach speichern verneinen kann.
Ausserdem liegen diese über 1.000 Videos auf einer externen Platte und da ist es drastisch viel praktischer das Inhaltsverzeichnis auf dem PC zu haben statt immer die externe Platte einstöpseln zu müssen.

Klar, für andere User ist das nicht nutzbar, weil es viel zu sehr auf genau meinen Bedarf ausgerichtet ist, aber das ist halt der Vorteil, wenn man ausschliesslich für den eigenen Bedarf programmiert.

Dass das in C++ ist liegt ganz schlicht daran, dass ich nichts Anderes kann und als Rentner viel zu alt bin jetzt für solche Kleinigkeiten an Eigenbedarf noch was Neues zu lernen.
 
Zuletzt bearbeitet:
Zurück
Oben