Zitat von
mkinzler:
Man könnte aber auch die Frage stellen, warum ein eigenes Format nötig ist?
Ich hatte mir auch einmal etwas Ähnliches überlegt (Briefe, e-Mails, Faxe usw. als Ablage zu einer Adressendatei speichern), bin aber davon abgekommen. Praktischer ist (in meinem Fall), die Dateien in entsprechenden Unterverzeichnissen zu speichern und ggf. als hidden/read-only zu markieren.
Wenn Du aber wirklich selbst speichern willst, schlage ich Folgendes vor:
1. Inhalte und Header in getrennte Dateien speichern: Archiv.Dat und Archiv.Dah
2. Die
Inhalte werden einfach aneinander gehängt; dann ist der Dateityp auch egal. Du wirst sowieso mit FileStream o.ä. arbeiten.
3. Die
Header-Datei ist eine normale
Datenbanktabelle:
3a. Ich empfehle (als NET-Entwickler) DataSet i.V.m.
XML-Datei.
3b. Alternativ ist jede andere Tabellenart geeignet, möglichst eine mit Index auf die laufende Nummer (die ist als PrimaryKey immer und überall dringendst zu empfehlen) und auf den Dateinamen.
3c. Wenn die Header-Datei beim Programmstart vollständig eingelesen wird, kannst Du auch mit einer Memory-Tabelle (ich hatte früher mit den Rx-Tools RxMemTable verwendet) und einer
CSV-Textdatei mit der
BDE arbeiten.
4. Die Header-Datei erhält etwa folgende Struktur nach Deinen Vorstellungen:
ID, Dateiname (je nach Verwendung mit oder ohne Pfad), Dateigröße, FileDateTime
5. Mit dem Index (oder im Speicher mit einfacher Suchfunktion) holst Du Dir die ID der gewünschten Datei.
6. Der benötigte Offset berechnet sich ruckzuck:
SELECT SUM(Dateigröße) AS Offset FROM Header WHERE ID < :AktuelleID
Wenn zwischendurch Dateien gelöscht werden, muss dies natürlich angepasst werden, z.B. durch verschachteltes SELECT i.V.m. COUNT(*) o.ä.
Ich hoffe, das nützt Dir. Jürgen