AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Dateiinfos lesen (schnellste Variante?)
Thema durchsuchen
Ansicht
Themen-Optionen

Dateiinfos lesen (schnellste Variante?)

Ein Thema von MicMic · begonnen am 28. Jan 2020 · letzter Beitrag vom 31. Jan 2020
Antwort Antwort
Seite 1 von 2  1 2      
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Dateiinfos lesen (schnellste Variante?)

  Alt 28. Jan 2020, 00:40
Hallo,
ich muss so schnell es geht Dateiinfos lesen.
Also z.B. die Bildgröße von Grafikdateien. JPG geht schon mal und beim NEF (Nikon RAW) bekomm ich noch 160x120.
Da muss ich wohl im Abschnitt "4.1 IFD#0, subIFD#0" lesen. (http://lclevy.free.fr/nef/). Wie muss ich noch schauen.

Aber gehe ich richtig davon aus, dass ich hier stets den Header immer lesen muss, wenn es schnell gehen soll? Ich habe schon weiter geschaut, z.B. bei MP4 (für Videogröße). Viel gelesen habe ich nicht, weil wieder alles in Englisch ist. Aber hier scheint es schon recht schwer zu werden. Auch will ich immer neue Dateitypen hinzufügen. Zum Beispiel die Anzahl von Seiten eines PDF-Dokuments oder die Musiklänge von MP3 Dateien.

Geht's auch einfacher? Oder muss ich hier doch immer neuen Dateitypen studieren, damit ich die Infos herauslesen kann, so wie ich sie möchte. Es gibt ja tausende Dateitypen... je nach Sinn und Zweck sollen immer wieder neue in mein Programm dazukommen.

Vielleicht hat ja jemand eine super Idee für mich?
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Dateiinfos lesen (schnellste Variante?)

  Alt 28. Jan 2020, 01:18
Hallo,
ich muss so schnell es geht Dateiinfos lesen.
Also z.B. die Bildgröße von Grafikdateien

z.B.
ist leider so nichtssagend, weil je Dateiormat wohl verschiedene Infos gewünscht werden (?)

immer wieder neue
Baue Plugins pro Dateityp, die die gewünschten Informationen ermitteln,
und schon ist es erweiterbar.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#3

AW: Dateiinfos lesen (schnellste Variante?)

  Alt 28. Jan 2020, 02:01
Im Explorer nisten sich manche Plugins ein, welche sowas anzeigen und als Spalte anzeigen können, oder die eine Seite/Tabsheet im Eigenschaftendialog der Datei darstellen.
Ich hoffe mal die lesen auch nur die Headerinfos aus, anstatt die Datei zu laden.
Nur den Wert der Spalten zu laden wird wohl einfacher sein, als ein ganzes Tabsheet, sich dort durch die Controls zu kämpfen und deren Werte rauszusuchen.

Im Prinzip kann man all diese Plugins auflisten, sich die passenden raussuchen (welche Spalten kommen von dort) und jenes Plugin dann dann selbst aufrufen/ausführen.



Ansonsten gibt es auch grlßer Image-Libraries, die Infos zu vielen Dateiformaten lieferen, können.



Im Linux gibt es eine Consolenanwendung, die Dateiinfos anzeigt (hab vergessen wie die heißt, aber kennt hier bestimmt wer),
das Ding ist OpenSource und man könnte deren innere Funktion es bestimmt auch nach Pascal übersetzen,
aber da in Windows 10 sich nun auch ein Linux-Subsystem installieren und dessen Programme sichwie die Windows-Konsolenanwendungen aufrufen lassen ... die Vermutung besteht nun, dass dieses Programm dort auch drin ist, oder sich zumindestens nachinstallieren lässt.
Das Ding parst scriptmäßig die Dateiheader und gibt verschiedenste Infos als Text raus, darunter auch die Bild-Größe vieler Dateiformate.

[edit] "file" war es, glaub ich
https://superuser.com/questions/2755...x-command-line
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (28. Jan 2020 um 02:11 Uhr)
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: Dateiinfos lesen (schnellste Variante?)

  Alt 28. Jan 2020, 23:56
Da ich ja immer wieder Infos aus neue Dateitypen lesen möchte, habe ich auch schon daran gedacht, dies als Plugin zu machen. Wie, weiß ich noch nicht. Aber das ist ja die 2. Anlaufstelle. Erst mal muss ich ja einen Datei-Header richtig lesen können. Dafür braucht man Dokumentationen und natürlich "das können"

Ich scheitere schon beim NEF-Format.
Es baut ja auf TIFF auf aber für mich ist das alles noch nicht so einfach.

Ich muss ja von (http://lclevy.free.fr/nef/) den Abschnitt "4.2 IFD#0, subIFD#1" lesen. Aber schaffe nur den Abschnitt "3. IFD#0" … was mir ein wenig klarer erscheint durch eine TIFF-Dokumentation.

Jedenfalls lese ich die Anzahl Tags und in der For-Schleife immer 12 Bytes. So kann hier der Abschnitt "3. IFD#0" gelesen werden.

Hier mal bissl Code. Bin ein wenig am herumprobieren aber hier mal das Zeugs für den normalen IFD Abschnitt. Den eigentlichen Aufbau habe ich im Netz gefunden und probiere gerade herum.

Code:
Type
  TTifHeader = Record
     Signature : Word;  
     Version   : Word;  
     IFD       : DWord;
  End;
  TIDF_Field  = Record
    Tag      : Word;
    FieldType : Word;
    ValCount : DWord;
    ValOffset : DWord;
  End;

VAR
  TifFile   : TFileStream;
  Header    : tTifHeader;
  DirEntries : Word;
  Field     : TIDF_Field;
  Cnt       : Integer;

  TifFile := TFileStream.Create (sFileName, fmOpenRead);
  Try
    TifFile.Read ( Header,8);
    // Prüfen auf TIFF Format (Ist bei NEF gleich)
    If ((Header.Signature = $04949) And (Header.Version = $0002A)) Or
       ((Header.Signature = $04D4D) And (Header.Version = $02A00)) Then
    Begin
      TifFile.Position := Header.IFD;
      TifFile.Read ( DirEntries, 2 ); // Anzahl Tags im ersten IFD
      For Cnt := 1 To DirEntries Do
      Begin
        TifFile.Read (Field,12);
        Case Field.Tag OF
          $0100 : iWidth := Field.ValOffset;
          $0101 : iHeight := Field.ValOffset;
          //  34665  : Break;
        End;
        // If (iWidth<>0) and (iHeight<>0) Then Break;
      End;
    End;
  Finally
    FreeAndNil ( TifFile );
  End;
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
880 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Dateiinfos lesen (schnellste Variante?)

  Alt 29. Jan 2020, 10:30
Da du auch mp3 ansprichst: da gibt es keine einfache und schnelle Methode, die zu 100%ig die richtigen Ergebnisse liefert. Ein Grund ist, dass es im MP3-Dateiformat keinen Header im eigentlichen Sinne gibt. Am Anfang kann der ID3v2-Tag stehen (hat mit Spieldauer in fast allen Fällen nichts zu tun), direkt der erste MPEG-Frame (der hat dann einen Header, der aber auch wenig bis nichts über die Dauer des Stückes aussagt), oder einfach ein paarhundert Nullbytes (z.B. durch einen Quick&Dirty gelöschten ID3v2-Tag). Der erste MPEG-Frame kann dann ein XING-oder INFO-Header sein, in dem die Anzahl der Frames stehen können, die für die Berechnung der Dauer sinnvoll sein kann (ein MPEG-Frame hat eine klar definierte Dauer) - besonders bei Dateien mit variabler Bitrate. Dort ist meistens so ein XING-Header drin, muss aber nicht. Diese Frame-Anzahl muss aber nicht mit der tatsächlichen Anzahl an Frames in der Datei übereinstimmen. Eine Kontrollmöglichkeit ist dort nicht vorgesehen ... kurz: Spieldauer von MP3-Dateien ist ein Krampf.

Ich habe hier z.B. ein Album, das ursprünglich in eine Datei gerippt wurde. Dabei wurde ein INFO-Header eingefügt, der die Frame-Anzahl angibt. Diese 60-Minuten-Datei wurde dann nachträglich geschnitten, ohne dass der Info-Header angepasst wurde, sodass dieser nur beim 1-Minuten-Intro stehen blieb, was bei der Berechnung der Dauer dann zu Fehlern führt. Könnte man durch eine Heuristik abfangen, weil dann (wegen der kleinen Dateigröße) die daraus folgende Bitrate unmöglich richtig sein kann, aber .... nun ja.

Dafür gibt es einige Libraries, die viele Fälle ganz gut abfangen (das genannte kaputt geschnittene Album allerdings nicht). z.B. die ID3Lib von Muetze1 oder meine Mp3FileUtils, die später zur AudioWerkzeugeBibliothek erweitert wurden, mit der man mit wenigen Zeilen Code die Spieldauer von recht vielen Audioformaten auslesen kann.

Wenn aber Menschenleben davon abhängen hilft bei MP3 nur, die ganze Datei zu parsen.
The angels have the phone box.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#6

AW: Dateiinfos lesen (schnellste Variante?)

  Alt 29. Jan 2020, 11:41
Dir wird wohl nichts anderes übrig bleiben, als die Infos, die Du anzeigen willst, Stück für Stück aus den Files zu kitzeln (meist).
Im Extremfall ist das aufwändig und es entstehen (schon betriebssystemseitig) Hilfskonstruktionen wie z.B. die Thumbnails Dateien für Bilder oder formatspezifisch eben das, wo Du gerade baggerst, Headerinfos oder auch Embedded Preview Images. (nebenbei, solche Mechanismen kannst Du natürlich auch nutzen-also mühsam erungene Dateiinfos puffern, solange die Datei unverändert bleibt)
Wenn du das so schnell es geht auslesen möchtest finde ich das schon mal löblich. Man sieht trotz dieses relativ selbstverständlichen Gedankens immer wieder schlechte Lösungen, die auch noch so frech sind, sich im Explorer einzuzecken und die Anzeige eines Ordners zum Geduldspiel werden lassen.
Wie auch immer die formatspezifische Implementierung bei Dir aussehen wird, ich empfehle Dir Multithreading sowie Nebenläufigkeit als Implementierungsbasis des Gesamtprozess. Dass man nicht ungefragt vorhandene (Ordner)Einstellungen überschreibt, sollte ja selbstverständlich sein.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Dateiinfos lesen (schnellste Variante?)

  Alt 29. Jan 2020, 13:03
Ich nutzte damals mehrere 4KB puffer, datenköpfe einlesen, parallel die puffer nach headern/signaturen prüfen, die dann wiederum an entprechende implementierungen weitergeleitet wurden.
Spezialfall bei mir waren halt die typen wo infos eher am dateiende hinterlegt sind. Da ging ich genauso vor allerdings mit 8 - 10 kb puffer und hab meine signaturen rückwärts gegengeprüft.
Am schlimmsten sind multimedia daten die sich aus den vorhanden chunks zusammensetzen und aufgerechnet werden müssen, die hab ich außen vor gelassen. (realmedia war des glaube ich)

edit
Am schlimmsten...*
sind auch dateien die nur über sprungziele zum ergebnis führen und mittendrinn "kaputte" vorkommen. Diesen fall hatte ich bei Entwicklung nicht berücksichtigt, also das sollte auch gecheckt werden nicht das man übers dateiende hinaus was lesen mag
Gruß vom KodeZwerg

Geändert von KodeZwerg (29. Jan 2020 um 13:17 Uhr)
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: Dateiinfos lesen (schnellste Variante?)

  Alt 31. Jan 2020, 13:16
Naja, noch probiere ich ein wenig herum an verschiedenen Dateitypen aber werde wohl schon für andere Ideen Ausschau halten
Es kommt ja auch noch dazu, dass es zu manchen Dateitypen noch verschiedene Versionen gibt. Dies muss man alles prüfen. Also doch viel viel Arbeit wenn man es richtig machen will. Danke für Eure Tipps und Anregungen.

Gruß Mike
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

AW: Dateiinfos lesen (schnellste Variante?)

  Alt 31. Jan 2020, 13:37
Wozu brauchst du das denn?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Dateiinfos lesen (schnellste Variante?)

  Alt 31. Jan 2020, 13:45
Ps: Je nach Anzahl der Dateien könnte es schneller über CreateFile / THandleStream abgearbeitet werden, da die Daten von Windows (soweit ichs in Erinnerung habe) nicht gecached werden... einfach mal rumprobieren / benchen.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz