ZIP-File mit C++ oder C Programm lesen (zipios++)

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
alexander_ro
Beiträge: 298
Registriert: 16.01.2006 17:44:21
Lizenz eigener Beiträge: GNU General Public License

ZIP-File mit C++ oder C Programm lesen (zipios++)

Beitrag von alexander_ro » 22.07.2009 18:05:08

Hallo Mädels und Jungs,

ich brauche in meinem Programm die möglichkeit Dateien aus einer ZIP-Datei zu extrahieren. Der Inhalt der ZIP-Datei sollte dann im Arbeitsspeicher stehen. Ich hab :google: befragt und der meinte zipios ist gut für sowas. Leider sind die Beispiele etwas dünn gesäht.

Ich hab das mal so versucht:

Code: Alles auswählen

      namespace zip = zipios;
      zip::ZipFile zFile ("./GIVERZ002.ZIP");

      zip::ConstEntries zFileEntries = zFile.entries ();
      zip::ConstEntries::iterator zFileIt;

      int i = 1;
      for (zFileIt = zFileEntries.begin (); zFileIt != zFileEntries.end (); zFileIt++)
      {
      // Zum testen den Index der zu verarbeitenden Datei ausgeben.
        std::cout << "Datei-Nr.: " << i << std::endl;

        std::string strDateiname = (*zFileIt)->getName ();
        std::cout << "Was kommt hier: " << (*zFileIt)->getName () << std::endl ;

      // Eine Datei aus dem ZIP einlesen.
        std::istream *iFile;
        std::string strHtmlSeite = "";
        try
        {
          iFile = zFile.getInputStream (*(zFileIt));
        }
        catch (std::ios_base::failure e)
        {
          if (iFile->good ())
          {
            std::cout << "Exception std::ios_base::failure, trotzdem alles OK: " << strDateiname << std::endl;
            std::cout << "Exception std::ios_base::failure, trotzdem alles OK: " << strDateiname << std::endl;
            // Das geht so nicht: std::cout << iFile->rdbuf ();
          }
          else
          {
            std::cout << e.what () << std::endl;
            std::cout << "zFile.getInputStream hat einen Fehler verursacht" << std::endl;
            std::cout << "Datei-Nr: " << i << ", Dateiname: " << strDateiname << std::endl;
            exit (1);
          }
        }
        catch (...)
        {
          std::cout << "irgend ein Problem hier" << std::endl;
        }

      // Lese die HTML-Seite aus der ZIP-Datei.
        std::stringstream strText;
        strText << iFile->rdbuf ();
        strHtmlSeite = strText.str ();
        delete (iFile);
        i++;
        std::cout << "*** Orginal-Text vor jeder Bearbeitung ***" << std::endl;
        std::cout << strHtmlSeite << std::endl;  // Orginal Text ausgeben
      }
Geht aber leider nur fast. Das Problem ist das ich zwar den Inhalt zu einem Dateinamen bekomme aber der ist von der falschen Datei. Wenn man das ZIP entpackt und dann in die Datei mit diesem Namen schaut hat sie einen anderen Inhalt als mein Programm zu dem Dateinamen ausgibt.

Habt Ihr vielleicht eine Idee was ich da falsch mache?

Wenn Ihr andere Lösungsvorschläge habt würden mich die auch interessieren (aber nur ohne den Aufruf externer Programme)?

Gruß
Alexander

Benutzeravatar
armin
Beiträge: 2682
Registriert: 17.03.2005 11:49:14

Re: ZIP-File mit C++ oder C Programm lesen (zipios++)

Beitrag von armin » 22.07.2009 20:00:12

Hab es zwar noch nicht persönlich benutzt, aber libzip [0] wird sehr oft genutzt.

[0] http://nih.at/libzip/
Formerly known as Trigger.
HP 8510p - Debian Sid
Mitglied des Debian-KDE-Teams

alexander_ro
Beiträge: 298
Registriert: 16.01.2006 17:44:21
Lizenz eigener Beiträge: GNU General Public License

Re: ZIP-File mit C++ oder C Programm lesen (zipios++)

Beitrag von alexander_ro » 23.07.2009 19:24:06

armin, danke für den Hinweis. Ich werd dann mal schauen wie das mit der geht.

Ich hab bei zipios++ jetzt mal nicht das Debian-Paket genommen sondern es selbst heruntergeladen und übersetzt. Allerdings mekert er hier die konsistenz der ZIP-Datei an. Die Datei wird aber im Verzeichnis tests mitgeliefert und lässt sich auch Problemlos entpacken mit unzip. Eigentlich schade das es nicht geht wäre sonst recht einfach anzuwenden.

Alexander

Antworten