Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   dwReserved1 nutzen? (https://www.delphipraxis.net/215417-dwreserved1-nutzen.html)

e-gon 28. Jun 2024 08:40

dwReserved1 nutzen?
 
Hallo,

einige Leute legten ihre Musikdateien zu einem größeren Archiv zusammen. Um der Datenmenge Herr zu werden, schrieb ich ein kleines Programm welches mit Hilfe einer Datenbank das Archiv verwaltet.

Zur Identifikation der Dateien nutzte ich zuerst den Dateinamen samt Dateipfad. Doch kommt es immer wieder vor, dass eine Musikdatei verschoben oder umbenannt wird (z. B. bei Korrekturen von Titel oder Interpret) und anschließend von meinem Programm nicht mehr auffindbar war. So ging ich dazu über bei jeder Datei dem Dateinamen eine eindeutige ID anzuhängen. Doch auch diese kann beim Umbenennen abhanden kommen.

Nach einigen Recherche stieß ich unter WIN32_FIND_DATA auf die Variablen dwReserved0 und dwReserved1. Meine Idee wäre nun dwReserved1 zu nutzen um dort die ID zu hinterlegen. Allerdings gibt es bezüglich dieser Variablen unterschiedliche Angaben im Netz. Mal sollen sie vom Typ DWORD und mal vom Typ Integer sein. Mal soll dwReserved0 bereits benutzt werden und mal sind dwReserved0 und dwReserved1 frei.

Deshalb meine Frage an euch: Haltet ihr die Nutzung von dwReserved1 für eine gute Idee? Und wie kann man diese Variable beschreiben?

PS: Natürlich gibt es unzählige andere Musikverwaltungsprogramme. Aber die Leute nutzen meine Software gerne und ich bin auch etwas stolz darauf! Also bitte keine Vorschläge für andere Verwaltungsprogramme!

e-gon

himitsu 28. Jun 2024 08:48

AW: dwReserved1 nutzen?
 
NEIN, weil im Dateisystem gibt es DORT einfach garnichts
und selbst wenn, dann wäre es sowieso beim Verschieben weg.

* entweder die Datei bearbeiten und ein eigenes ID3-Tag mit deiner ID reinschreiben
* oder es wie jeder andere machen ... einen HASH der Datei berechnen und das speichern. (CRC32, MD5, SHA1, SHA2, SHA256 oder sonstwas)

e-gon 28. Jun 2024 09:03

AW: dwReserved1 nutzen?
 
Hallo himitsu,

danke für deine schnelle Antwort! Aber bist Du sicher, dass der Inhalt beim Verschieben abhanden kommt? Andere in WIN32_FIND_DATA gespeicherte Daten (wie CreationTime, LastAccessTime, LastWriteTime, dwFileAttributes) gehen dabei ja auch nicht verloren.

Einen Hash zu berechnen dauert mir etwas zu lange, aber stimmt, an ID3-Tag habe ich gar nicht gedacht. Allerdings geht das ja nur bei mp3 und nicht bei anderen Musikformaten und bei Videos, oder?

e-gon

jaenicke 28. Jun 2024 09:20

AW: dwReserved1 nutzen?
 
Du kannst Dateidatenströme verwenden:
https://learn.microsoft.com/de-de/wi...o/file-streams
Diese bleiben auch beim Umbenennen, Verschieben und Kopieren erhalten, sofern NTFS verwendet wird.

e-gon 28. Jun 2024 09:36

AW: dwReserved1 nutzen?
 
Hallo jaenicke,

danke, ein sehr interessanter Vorschlag. Muss ich mich mal näher damit befassen...

Vielen Dank!

e-fon

himitsu 28. Jun 2024 09:37

AW: dwReserved1 nutzen?
 
Bei .WAV nicht, aber viele Videoformate und mehrere Audioformate kennen auch sowas, wie Attribute/Infos, die man drinnen ablegen kann.

Redeemer 28. Jun 2024 09:40

AW: dwReserved1 nutzen?
 
Du hast glaube ich keine Ahnung, was du schreibst.
Du willst Daten suchen, sprich lesen. Wieso willst du in einer Datenstruktur Daten schreiben, die eine Anforderung zum Lesen beschreibt? Beides für sich genommen (Lesen und Anforderung) ist bereits maximal falsch: Du kannst keine Daten lesen, die nie geschrieben wurden, und du kannst in einer im Arbeitsspeicher abgelegten Anforderung nichts dauerhaft speichern.
Das ist exakt so, als würdest du einen leeren Notizblock nehmen, "Zeig mir die Bild-Zeitung von heute!" sagen und dich dann wundern, dass auf dem Notizblock immer noch nichts steht.

himitsu 28. Jun 2024 09:44

AW: dwReserved1 nutzen?
 
Für die Synology gibt es so eine Bilder/Videoplatform ... die Eine kann auch "Tags" in die Fotos/Videos schreiben (z.B. manuelle Tags, aber auch aus der BilderkennungsKI), damit sie beim Suchen genutzt werden können, auch wenn Dateien umbenannt/kopiert/verschoben werden.

e-gon 28. Jun 2024 10:26

AW: dwReserved1 nutzen?
 
Danke himitsu,

ob die Daten auf einer Synology-DS liegen muss ich erst noch herausfinden. Bezüglich Tags in Video- und Audioformaten fand ich tatsächlich einige Beispiele. Das Problem dabei ist, dass das Schreiben/Auslesen nicht überall gleich funktioniert und ich somit für jeden Dateityp etwas programmieren müsste.

Zitat:

Zitat von Redeemer (Beitrag 1538344)
Du hast glaube ich keine Ahnung, was du schreibst.
Du willst Daten suchen, sprich lesen. Wieso willst du in einer Datenstruktur Daten schreiben, die eine Anforderung zum Lesen beschreibt? Beides für sich genommen (Lesen und Anforderung) ist bereits maximal falsch: Du kannst keine Daten lesen, die nie geschrieben wurden, und du kannst in einer im Arbeitsspeicher abgelegten Anforderung nichts dauerhaft speichern.
Das ist exakt so, als würdest du einen leeren Notizblock nehmen, "Zeig mir die Bild-Zeitung von heute!" sagen und dich dann wundern, dass auf dem Notizblock immer noch nichts steht.

Ich verstehe die Kritik nicht so richtig. Die Variablen dwReserved0 und dwReserved1 sind in der Datenstruktur von WIN32_FIND_DATA hinterlegt. Es wird also dafür Speicherplatz reserviert und auch im Dateisystem zusammen mit CreationTime, LastAccessTime, LastWriteTime, dwFileAttributes auf der Festplatte abgelegt. Ansonsten wären die vorbereiteten, zukünftig vielleicht benutzten Variablen ja unsinnig.

Ob dwReserved0 und dwReserved1 jedoch beim Umbenennen und/oder verschieben mitgeführt werden, steht natürlich auf einem anderen Blatt...

e-gon

himitsu 28. Jun 2024 10:48

AW: dwReserved1 nutzen?
 
Es ist die Structur im RAM, für diese WinAPI.
Es hat aber nichts mit der Struktur im Dateisystem (FAT16,FAT32,NTFS,ReFS,usw.) zu tun.

jaenicke 28. Jun 2024 10:48

AW: dwReserved1 nutzen?
 
Zitat:

Zitat von e-gon (Beitrag 1538348)
Ich verstehe die Kritik nicht so richtig. Die Variablen dwReserved0 und dwReserved1 sind in der Datenstruktur von WIN32_FIND_DATA hinterlegt. Es wird also dafür Speicherplatz reserviert und auch im Dateisystem zusammen mit CreationTime, LastAccessTime, LastWriteTime, dwFileAttributes auf der Festplatte abgelegt.

Wie kommst du darauf? Ich sehe dafür keinen Hinweis. Solche Werte können auch genauso gut beim Auslesen dynamisch ermittelt werden oder eben gar nicht gesetzt werden. Die anderen Werte liegen auch nicht so als Datenstruktur herum, sondern werden als Attribut abgelegt.

Speichern könntest du die Werte aber ohnehin nicht, da du die Datenstruktur nur zum Auslesen bekommst.

Gausi 28. Jun 2024 10:59

AW: dwReserved1 nutzen?
 
Wenn irgendwo "Reserved" dran steht, dann sollte man diese Felder imho nicht für eigene Zwecke missbrauchen. Falls das überhaupt möglich ist.

Frage: was soll dein Programm denn machen, wenn der User eine Datei außerhalb deines Programms verschoben hat und der Datenbankeintrag daher ungültig geworden ist?

Soll dann die ganze Festplatte nach einer Datei durchsucht werden, die der in der DB entspricht? Und wenn der Anwender an der Ordnerstruktur was ändert, dann wird diese Suche für hunderte oder gar zig-tausende Dateien durchgeführt?

Ich denke, dass das dem Anwender klar sein sollte: Wenn man ein Dateiverwaltungstool nutzt, und die Dateien außerhalb des Tools verschiebt oder umbenennt, dann muss man im Anschluss die Dateien neu von dem Tool suchen lassen. Da einen Automatismus zu erwarten, halte ich für eine stark überzogene Anwender-Anforderung.

Wenn dein Tool zusätzliche Informationen zu den Dateien speichert (die ggf. auch vom Anwender bearbeitet werden können), dann gehören diese Infos imho in die Metadaten der Datei. Zumindest solange die Dateien dadurch nicht zu sehr aufgebläht werden. Für eine eindeutige ID sollte da aber auf jeden Fall Platz sein. Oder halt alternative Wege, die (wahrscheinlich) bei den üblichen Verzeichnis-Aktionen erhalten bleiben. Alternative Datenströme an den Dateien, oder je eine versteckte "Info-Datei" pro Verzeichnis. Eine 100%ige Garantie dafür, dass die Infos erhalten bleiben, gibt es aber natürlich nicht.

Bei mp3 sind die ID3-Tags z.B. oft voll mit "Private Frames" vom Windows Media Player, iTunes und anderen, die dann von der jeweiligen "Datenbank" dahinter benutzt werden. Amazon nutzt z.B. das Kommantar-Feld für eine eindeutige Song-ID, und in einem speziellen Private-Frame werden afaik u.a. verschlüsselt Informationen zum Käufer gespeichert. Filesharing von Amazon-Mp3s ist daher eine ganz blöde Idee. ;-)

Die Tag-Formate in anderen Audio-Dateitypen können ebenso dazu genutzt werden.

e-gon 28. Jun 2024 11:02

AW: dwReserved1 nutzen?
 
Ich fand im Netz folgendes:

dwReserved0
Wenn das dwFileAttributes-Element das attribut FILE_ATTRIBUTE_REPARSE_POINT enthält, gibt dieses Element das Reparsepunkttag an.
Andernfalls ist dieser Wert nicht definiert und sollte nicht verwendet werden.

Wenn ihr recht hättet, wäre ja jeder Dateisystemeintrag mit FILE_ATTRIBUTE_REPARSE_POINT 4 Byte länger als einer ohne. Und bei Änderung des Attributs würde der Eintag entweder kürzer oder länger. Kann das wirklich sein?

e-gon

e-gon 28. Jun 2024 11:05

AW: dwReserved1 nutzen?
 
Zitat:

Zitat von Gausi (Beitrag 1538351)
Frage: was soll dein Programm denn machen, wenn der User eine Datei außerhalb deines Programms verschoben hat und der Datenbankeintrag daher ungültig geworden ist?

Soll dann die ganze Festplatte nach einer Datei durchsucht werden, die der in der DB entspricht? Und wenn der Anwender an der Ordnerstruktur was ändert, dann wird diese Suche für hunderte oder gar zig-tausende Dateien durchgeführt?

Im Hintergrund scanne ich tatsächlich in regelmäßigen Abständen den "Musik-Bereich" der Festplatte nach verschobenen Dateien.

e-gon

jaenicke 28. Jun 2024 11:52

AW: dwReserved1 nutzen?
 
Zitat:

Zitat von e-gon (Beitrag 1538352)
Wenn ihr recht hättet, wäre ja jeder Dateisystemeintrag mit FILE_ATTRIBUTE_REPARSE_POINT 4 Byte länger als einer ohne. Und bei Änderung des Attributs würde der Eintag entweder kürzer oder länger.

Das klingt, als ob du vollkommen falsche Vorstellungen der Speicherung z.B. eines NTFS-Dateisystems hast.

e-gon 28. Jun 2024 11:59

AW: dwReserved1 nutzen?
 
Zitat:

Zitat von jaenicke (Beitrag 1538355)
Zitat:

Zitat von e-gon (Beitrag 1538352)
Wenn ihr recht hättet, wäre ja jeder Dateisystemeintrag mit FILE_ATTRIBUTE_REPARSE_POINT 4 Byte länger als einer ohne. Und bei Änderung des Attributs würde der Eintag entweder kürzer oder länger.

Das klingt, als ob du vollkommen falsche Vorstellungen der Speicherung z.B. eines NTFS-Dateisystems hast.

Das will ich nicht ausschließen...

Zitat:

Zitat von jaenicke (Beitrag 1538350)
Solche Werte können auch genauso gut beim Auslesen dynamisch ermittelt werden oder eben gar nicht gesetzt werden. Die anderen Werte liegen auch nicht so als Datenstruktur herum, sondern werden als Attribut abgelegt.

Stimmt allerdings.

Zitat:

Zitat von jaenicke (Beitrag 1538350)
Speichern könntest du die Werte aber ohnehin nicht, da du die Datenstruktur nur zum Auslesen bekommst.

Ja, damit hat sich die Sache so oder so erledigt.

Werde mir die Datenstöme nochmals genauer anschauen.

Danke für die vielen hilfereichen Beiträge!

e-gon

himitsu 28. Jun 2024 14:02

AW: dwReserved1 nutzen?
 
Gern nochmal:

Dieser Record hat garnichts mit der Speicherung auf der Festplatte gemeinsam.

* bei NTFS gibt es einmal einen Eintrag in der MasterFileTable, aber auch nochmal klassische Dateiverzeichnislisten, wie im FAT
* bei FAT32 liegen die Dateiinfos in einem FATRecord des Verzeichnisses, zusammem mit dem ShortFileName ... während der LongFileName einen oder mehrere "andere" FAT-Records in diesem Verzeichnis belegt, was dann beim Suchen zusammenkopiert wird.

Rate mal, warum es keine Funktion gibt, um diesen Such-Record wieder im Dateisystem zu speichern.

gubbe 28. Jun 2024 15:17

AW: dwReserved1 nutzen?
 
Zitat:

Zitat von e-gon (Beitrag 1538356)

Werde mir die Datenstöme nochmals genauer anschauen.

Das bringt Dir nur leider nichts, wenn Deine Benutzer die Daten hin- und herkopieren, z.B. auf USB-Sticks mit FAT-Dateisystem oder ein NAS. Die Datenströme sind wie hier schon geschrieben wurde auf NTFS beschränkt. Meines Erachtens kein praktikabler Weg für Deinen Anwendungsfall.

Wenn Du sowieso im Hintergrund nach verschobenen Dateien suchst, wäre es wohl (wie himitsu vorschlägt) am besten, einen Hash-Wert zu merken, um die Dateien wiederzuerkennen. Die Hash-Werte müssen ja nur für neu hinzugekommene (oder umbenannte Dateien zum Vergleich) ermittelt werden. Das kann auch im Hintergrund laufen.

Redeemer 29. Jun 2024 07:28

AW: dwReserved1 nutzen?
 
Es gibt die Möglichkeit, einen Fingerprint der Rohdaten zu machen. Dafür müsste man die Rohdaten aus der Datei herausholen. Und dafür braucht man tiefe Kenntnisse jedes unterstützten Dateiformats. Und scheitert doch bei Duplikaten.

Gausi 29. Jun 2024 09:35

AW: dwReserved1 nutzen?
 
Zitat:

Zitat von gubbe (Beitrag 1538361)
Wenn Du sowieso im Hintergrund nach verschobenen Dateien suchst, wäre es wohl (wie himitsu vorschlägt) am besten, einen Hash-Wert zu merken, um die Dateien wiederzuerkennen. Die Hash-Werte müssen ja nur für neu hinzugekommene (oder umbenannte Dateien zum Vergleich) ermittelt werden. Das kann auch im Hintergrund laufen.

Das mit den Hashwerten funktioniert aber nur sinnvoll, wenn sichergestellt ist, dass sich die Dateien nicht verändern. Grade bei Audio-Dateien ist es aber durchaus üblich, dass sich diese immer wieder mal ändern - nicht der Audioteil, aber durchaus die Metadaten. So kann z.B. eine "Bewertung" in die ID3Tags geschrieben werden, die ja nicht unbedingt fix ist. mein Player merkt sich z.B. auch (natürlich optional, Opt-In) einen Abspielzähler darin.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz