[C++] Probleme bei Implementierung eines eigenen Datei-Archiv-Formats

_Grubi

Erfahrenes Mitglied
Hallo,

für ein etwas größeres Projekt sind wir momentan dabei ein eigenes Datei-Archiv-Format zu entwerfen. Wie das aussehen soll und wie wir damit arbeitet können steht schon fest und ist auch kein Problem. Da ich aber ungerne mit einer Parent-Child Logik arbeiten will, suche ich momentan nach einer Möglichkeit, wie ich ein Verzeichnisbaum mit Dateien hirarchisch abgebildet bekomme, was an sich kein Problem wäre, wenn man dieses Archiv nicht auch bearbeiten können soll. Das Archiv soll also so aufgebaut sein, dass die Verzeichnisse so darin auftauchen, dass sie durch ein einfaches aneinande hängen der Namen den Pfad ergeben ohne, dass man groß mit irgendeiner Parent-Child-Logik arbeiten muss (IDs oder Ähnliches). Enthält ein Verzeichnis Dateien, so sollen diese direkt danach in dem Archiv autauchen (nur eine Art Header. Daten werden wahrscheinlich weiter "hinten" untergebracht)

Mir stellt sich nun aber die Frage, wie ich in die Mitte einer Datei schreiben kann, was ich für dieses Weg benötigen würde. Mir fällt nur die Möglichkeit ein, die Daten bis zu dieser Position in eine neue Datei zu schreiben, die neuen Daten dahinter zu hänge und anschließend die verbleibenden Daten aus der alten Datei hinzufüge. Anschließend wird die Datei einfach mit der neuen überschrieben.
Schön und gut, wenn es nun nicht das nächste Problem gäbe, denn dieses Archiv-Format soll am Ende Daten von mehreren 100 MB in sich vereinen. Daher schätze ich, dass diese Variante wohl eine sehr schelchte Performance hätte und mit zu viel temporären Speicher belastet wäre.
Ich habe auch schon im WWW gesucht, aber nur diese Variante scheint es zu geben.

Habt ihr vielleicht eine Idee, wie ich es bewerksteligen kann, dass ich an eine beliebige Stelle innerhalb des Archivs neue Daten schreiben kann ohne, dass ich diesen Kopieraufwand habe oder bleibt mir da nur eine Parent-Child-Logik?
Ich weiß, dass es irgendwie gehen muss, da ich auf meinem Rechner etwas habe, dass so zu arbeiten scheint, wie ich es gerne hätte. Ich habe jedoch keinerlei Sourcen von diesem Archiv-Writer (nur vom Reader für dieses Format).

Ich bin für jeden Tipp dankebar :)

Gruß,
grubi
 
Bei einer Festplatte oder ähnlichem besteht eine Datei aus einer verketteten Liste von Datenblöcken gleicher Größe, z.B. 4kb groß. Um das zu nutzen musst du sehr hardwarenah programmieren. Dann kannst du einzelne Blöcke belegen, danach beschreiben und an passender Stelle in die bisherige Blockliste einfügen. Dieses Vorgehen verursacht allerdings auch Probleme.
  • Die Datenmenge wird wahrscheinlich kein Vielfaches der Blocklänge sein, du musst also ungenutzte Datenbereiche innerhalb deiner Datei handhaben können.
  • Diese Speicherlecks verursachen auch wiederum eine Aufblähung der Gesamtdatei.
  • Du musst die Metainformationen des Dateiheaders 'von Hand' aktualisieren.
  • Es kann sein, dass zur Nutzung der notwendigen Funktionen bestimmte Benutzerrechte gesetzt sein müssen.
  • Nicht jede Programmiersprache unterstützt eine solch hardwarenahe Implementierung. Ich kenne die C++-Bibliotheken nicht so genau, aber zumindest mit ANSI-C müsste es machbar sein.
  • Die Implementierung wird nicht plattformunabhängig sein, UNIX verwendet andere Dateiheader als Windows, und diverse Features wie beispielsweise Journaling müssen unterstützt werden. Das Programm muss also für jedes Dateisystem (NTFS, ext3, jfs...) besonders angepasst werden.
 
Zuletzt bearbeitet:
Danke dir :)

Also bliebe mir dann mehr oder weniger nur ein Vorgehen wie beim ZIP-Format. Dort wird die Dateiliste des Archivs ans Ende gestellt und davor befinden sich die Daten. Die Dateiliste müsste eh neu aufgebaut werden. Dann kann ich die Daten einfach ans ende der Letzten Dateidaten anhängen (Dateiliste überschreiben), den Offset in der Liste vermerken und dann die Liste wieder hintendran hängen.
Beim Löschen von Daten aus dem Archiv sollte es mir möglich sein, einfach die Daten, die nach der zu löschenden Datei kommen, nach vorne zu "schieben" (read, write mit Hilfe von seek)

Bin für weitere Tipps offen.
 
Zurück