c++ - Dateien verpacken und auslesen



  • guten abend 🙂

    ich habe vor, einige dateien (bilder icos usw) zu archievieren und daraum mit einem programm zugreifen. das ganze soll in c++ geschehen, aber ich habe keine ahnung wie ich es anstellen soll ...

    gibt es eine windowsfunktion dafür?
    oder einen extra bibliotheK?

    deswegen bitte ich um hilfe ... (vielleicht nur ein hinweis in die richtige richtung 😉 )

    bin für jede antwort dankbar 😃

    lg rotzkerl


  • Mod

    Erläutere mal dein Vorhaben. "Archivieren" und "Zugreifen" sind sehr allgemeine Begriffe die viele unterschiedliche Dinge bedeuten können.



  • nun .. ich wollte paar dateien vor ubefugtem zugriff sichen ...
    aber im quellcode auf die "paar" dateien zugreifen 🙂

    ich entschuldige mich für die verwirrung 😉


  • Mod

    Es wird immer verwirrender. Willst du sie verschlüsseln?



  • SeppJ schrieb:

    Es wird immer verwirrender. Willst du sie verschlüsseln?

    Ich glaube ja.



  • erstmal möchte ich für die schnellen antworten danken 😉

    ja ich möchte sie gern verschlüsseln (aber kein verschlüsselter rar archiv 😉 )

    ich möchte kein ausführiches tutorial darüber
    ich wäre sehr dankbar mit einem hinweis "in die richtige richtung"



  • Wie wäre es mit crypto++?



  • vielen dank!

    werde ich gleich ausprobieren 😉



  • Wie wär's mit einer Resourcen-Dll?



  • ich möchte gerne in der datei mit verzeichnissen arbeiten zb

    im ordner bilder befinden sich bil1.bild, bild2.bild und bild3.bild das ganze sollte in einer datei archiviert werden zb arhiv.endung

    im quellcode moechte ich auf bild1.bild zugreifen und das soll vielleicht so geschehen @arhiv.endung\bilder\bild1.bild

    🙄


  • Mod

    War wäre es mit einem tar-Archiv? Da gibt's Bibliotheken für und hinterher kannst du das ganze noch sehr einfach weiterbehandeln (z.B. packen/verschlüsseln), weil alles eine Datei ist.



  • rotzkerl schrieb:

    nun .. ich wollte paar dateien vor ubefugtem zugriff sichen ...
    aber im quellcode auf die "paar" dateien zugreifen

    Unmöglich, jemand anders könnte den genau gleichen Quellcode schreiben, ein paar Zeilen ändern und die Dateien woanders unverschlüsselt hinkopieren.

    Falls du das vermeiden willst geht das nur, indem du die Dateien mit einem Passwort verschlüsselt.

    Um Ordner zu verschlüsseln packe ich diesen in ein Tar-Archiv und verschlüssle dieses.

    Verschlüsselungstechniken siehe http://de.wikipedia.org/wiki/Symmetrisches_Kryptosystem#Verfahren.

    Zu deiner letzten Anmerkung folgende Bemerkung: Lieber erst einmal richtig C++ lernen.



  • uncrackable schrieb:

    Zu deiner letzten Anmerkung folgende Bemerkung: Lieber erst einmal richtig C++ lernen.

    - an dem würds vielleicht liegen 😉

    danke trozdem 🙂 - werd mir den artikel in wikipedia druchlesen
    - werde mir vielleicht nocht literatur zum stichwort Symmetrisches Kryptosystem anschaffen 😉

    leider ist es auch nicht wirklich das was ich wollte 😞



  • Naja, im Prinzip ist es doch simpel erst mal alles in ein Archiv zu packen.

    Bastle einen Header ala

    struct FileEntry
    {
      size_t size;
      size_t fileOffset;
      char name[256];
    }
    
    struct FileHeader
    {
      size_t numEntries;
    }
    

    Dann könnte dein Archiv wie folgt aussehen angenommen du hast die Dateien text1.txt und text2.txt

    FileHeader
    ->numEntries = 2
    FileEntry
    ->size = Größe text1.txt
    ->offset = Offset zu text1.txt ab Dateianfang
    ->name = "text1.txt"
    FileEntry
    ->size = Größe text2.txt
    ->offset = Offset zu text2.txt ab Dateianfang
    ->name = "text2.txt"
    [Inhalt text1.txt]
    [Inhalt text2.txt]

    Iterieren könnte man darüber wie folgt, angenommen buffer ist ein char* der auf die komplette, geladene Datei zeigt:

    FileHeader* header = reinterpret_cast<FileHeader*>(buffer);
    FileEntry* entries = reinterpret_cast<FileEntry*>(buffer + sizeof(FileHeader));
    for(size_t i = 0; i < header->numEntries; ++i, ++entries)
    {
      cout << "Size: " << entries->size << "\n";
      cout << "Offset: " << entries->fileOffset << "\n";
      cout << "Name: " << entries->fileOffset << "\n";
      cout << "Content:" << "\n";
    
      cout.write(buffer + entries->fileOffset, entries->size);
    }
    

    Das wäre nur das Grundprinzip wie ein Archiv funktioniert, dass da eine Menge Funktionalität fehlt ist klar 😉



  • Danke schön!!

    Genau das wollte ich 😃
    Haben Sie vielleicht Links zur weiterführung diese Themas?



  • Icematix schrieb:

    struct FileEntry
    {
      size_t size;
      size_t fileOffset;
      char name[256];
    }
    

    Man könnte die zlib zum Komprimieren der Daten benutzen. Der Struktur könnten noch size_t uncSize hinzugefügt werden, sodass man gleich einen ausreichend großen Buffer zur Verfügung stellen kann.
    Die ZLib ist zwar eines C, jedoch sehr gut dokumentiert und einfach zu benutzen.

    Und für Icons und Computergrafiken ist dieser Kompresssionsalgorithmus hervorragend geeignet.
    Es ist natürlich keine Verschlüsselung, wenn man ein eigenes Dateiformat entwickelt, ist es aber ungleich schwerer, an den Inhalt zu kommen (und den Aufwand meist nicht wert).



  • Jop, Sachen wie ein Hash um korrupte Dateien zu bemerken wäre imo auch Pflicht.
    Ich wollte es eben schlicht halten. 😉

    Die komprimierten Dateien könnte man auch noch simpel mit Crypto++ crypten (zb AES) und noch zum bequemen Prüfen einen Passworthash(mind 256bit, 512bit optimal) im FileEntry speichern.



  • Käme SQLite3 vielleicht in Frage? Hab´ schon länger nicht mehr in die Doku geguckt und kenne auch nicht alle Features, aber mit etwas Glück ist das Zugriffsschutz per Passwort und Kompression inbegriffen. Dann musst du dich nicht mehr selbst um die ganze Archivverwaltung kümmern, das erledigt das DBMS für dich.

    Grad mal nachgeschaut:
    SQLite3 unterstützt von Haus aus weder Kompression noch Passwortschutz, beides lässt sich aber per Extension nachrüsten (SQLite Encryption Extension und sqlitecompress).



  • DocShoe schrieb:

    Käme SQLite3 vielleicht in Frage? Hab´ schon länger nicht mehr in die Doku geguckt und kenne auch nicht alle Features, aber mit etwas Glück ist das Zugriffsschutz per Passwort und Kompression inbegriffen. Dann musst du dich nicht mehr selbst um die ganze Archivverwaltung kümmern, das erledigt das DBMS für dich.

    Grad mal nachgeschaut:
    SQLite3 unterstützt von Haus aus weder Kompression noch Passwortschutz, beides lässt sich aber per Extension nachrüsten (SQLite Encryption Extension und sqlitecompress).

    Da würde ich persönlich dann eher zlib oder eines der C++ Bindings bzw "vereinfachungen" nehmen ( die als Ausgang aber immer noch zlib haben ).
    rya.



  • ich habe mir die zlib heruntergeladen, entpackt und habe im ordner contrib/vstudio/vc10 den wrapper gestartet das programm kompiliert und ein fehlermeldug bekommen

    1>  Alle Ausgaben sind aktuell.
    1>ResourceCompile:
    1>  Alle Ausgaben sind aktuell.
    
    1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(990,5): warning MSB8012:
     TargetPath(C:\Users\Computer\Desktop\zlib-1.2.5\contrib\vstudio\vc9\x86\ZlibDllDebug\zlibvc.dll) entspricht nicht dem OutputFile-Eigenschaftswert 
     (C:\Users\Computer\Desktop\zlib-1.2.5\contrib\vstudio\vc9\x86\ZlibDllDebug\zlibwapi.dll) von Linker. 
     Das Projekt wird daher möglicherweise nicht ordnungsgemäß erstellt. 
     Damit dieses Problem behoben werden kann, müssen die Eigenschaftswerte für $(OutDir), 
     $(TargetName) und $(TargetExt) dem in %(Link.OutputFile) angegebenen Wert entsprechen.
    
    1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(992,5): warning MSB8012:
     TargetName(zlibvc) entspricht nicht dem OutputFile-Eigenschaftswert (zlibwapi) von Linker.
     Das Projekt wird daher möglicherweise nicht ordnungsgemäß erstellt.
     Damit dieses Problem behoben werden kann, müssen die Eigenschaftswerte für $(OutDir),
     $(TargetName) und $(TargetExt) dem in %(Link.OutputFile) angegebenen Wert entsprechen.
    
    1>LINK : fatal error LNK1104: Datei "..\..\masmx86\match686.obj" kann nicht geöffnet werden.
    1>
    

Anmelden zum Antworten