quazip

Alles rund um die Programmierung mit Qt
Antworten
Erni35
Beiträge: 15
Registriert: 21. Juli 2009 21:49

quazip

Beitrag von Erni35 »

Hallo Forum,

ich versuche gerade krampfhaft eine DAtei in eine zip-Datei zu pressen.
Folgender Code:

QuaZip zip(tr("test.zip"));
if(!zip.open(QuaZip::mdCreate)) {
qDebug("testCreate(): zip.open(): %d", zip.getZipError());
return;
}
QFile inFile;
QuaZipFile outFile(&zip);
char c;

inFile.setFileName("textlog.log");

outFile.open(QIODevice::WriteOnly, QuaZipNewInfo(inFile.fileName(), inFile.fileName()));
qDebug("testCreate(): outFile.open(): %d", outFile.getZipError());

while(inFile.getChar(&c)&&outFile.putChar(c));
if(outFile.getZipError()!=UNZ_OK)
{
qWarning("testCreate(): outFile.putChar(): %d", outFile.getZipError());
return;
}
outFile.close();
inFile.close();
zip.close();

Leider ist die Datei danach immer nur 0 Byter groß und ohne INhalt. Könnt ihr mir helfen?

Erni35
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag von Mani99 »

Wäre brauchbarer wenn du den source in code tags einschließen könntest!

Ein paar fragen hätte ich noch:
1. Warum schreibst du folgende zeile? Ich beziehe mich hier auf das "tr", was hat das hier für einen sinn?

Code: Alles auswählen

QuaZip zip(tr("test.zip"));
2. Warum postest du dein problem in "Snippets, Tipps & Tricks"?

3. Hast du diesen beitrag schon gelesen?
Troll.Soft
Beiträge: 190
Registriert: 18. Juni 2008 09:52
Wohnort: Hamburg

Beitrag von Troll.Soft »

Hallo Erni,
warum so kompliziert. Nutze doch Qt und nicht verquakte zips.

QFile liest ein Array, das wird gezipt und QFile schreibt ein Array.
Alles ein Fünfzeiler.

hier ist die Funktion, die Du suchst:

Code: Alles auswählen

QByteArray qCompress ( const QByteArray & data, int compressionLevel = -1 )
Compresses the data byte array and returns the compressed data in a new byte array.

The compressionLevel parameter specifies how much compression should be used. Valid values are between 0 and 9, with 9 corresponding to the greatest compression (i.e. smaller compressed data) at the cost of using a slower algorithm. Smaller values (8, 7, ..., 1) provide successively less compression at slightly faster speeds. The value 0 corresponds to no compression at all. The default value is -1, which specifies zlib's default compression.

See also qUncompress().
tschüß
Troll.Soft
AQtNewbie
Beiträge: 23
Registriert: 1. Oktober 2012 13:03

Re: quazip

Beitrag von AQtNewbie »

Leider benötigt qCompress/qUncompress ein QByteArray. Darüber hinaus kann die Funktion nur eine einzelne Entität auf einmal komprimieren. Diesen Effekt möchte man meistens am wenigsten haben.
Ich habe selbst einige Recherchen angestellt und mich letztlich auch für QuaZip entschieden.
Mani99 hat geschrieben: 3. Hast du diesen beitrag schon gelesen?
Meiner Meinung nach die beste Hilfestellung in diesem Thread. ;)
Erni35
Beiträge: 15
Registriert: 21. Juli 2009 21:49

Re: quazip

Beitrag von Erni35 »

Mani's Hinweis passt.

Danke,
Erni35
AQtNewbie
Beiträge: 23
Registriert: 1. Oktober 2012 13:03

Re: quazip

Beitrag von AQtNewbie »

Ich hätte da jedoch selbst noch eine Frage an die Community (möchte diesbezüglich nicht gleich ein neues Thema eröffnen):

Ich habe in meinem Programm Dateien aus einem Dateipfad gelesen und in ein QListWidget geschrieben.
Nun soll der User via ListWidgetItems die Dateien, die er weiter verwenden möchte, auswählen, dies funktioniert via Checkbox.
Als nächstes werden ausgewählte Dateien comprimiert und verpackt. Das zip soll auf einen bestimmten Pfad gelegt werden.

Ich lese schon etwas länger die QuaZIP Dokumentation, komme aber nicht so richtig auf einen grünen Zweig. Darüber hinaus verwirren mich diverse Anwendungsbeispiele in diesem Forum.
Letztendlich meine Frage:
Kann ich einfach folgende Funktionen derart verwenden (ich bin da etwas ideenlos, wie ich an die Sache nacheinander herangehen soll)?
QStringList list;
//...
//in list werden QListWidgetItems, die selektiert wurden "abgelegt"
bool JlCompress::compressFiles(QString fileCompressed, list);
QuaZip zip(fileCompressed);

Das wäre so mein Ideenansatz, dessen Richtigkeit ich erfragen möchte.
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: quazip

Beitrag von veeman »

AQtNewbie hat geschrieben: QStringList list;
//...
//in list werden QListWidgetItems, die selektiert wurden "abgelegt"
bool JlCompress::compressFiles(QString fileCompressed, list);
QuaZip zip(fileCompressed);

Das wäre so mein Ideenansatz, dessen Richtigkeit ich erfragen möchte.
Ausprobieren?
Ansonsten ja so sollte es gehen, insofern du selektierten Elemente richtig in die list ablegst.
Aber warum öffnest du dass Archiv anschliessend wieder, zweck? Zum testen?

Mfg veeman
AQtNewbie
Beiträge: 23
Registriert: 1. Oktober 2012 13:03

Re: quazip

Beitrag von AQtNewbie »

Im Moment habe ich es noch so verstanden, dass das erstellte Zipfile erst geöffnet werden muss, damit man Files hineinpackt. Anschließend schließt man das Zipfile.
Code vom anderen Thema (welches weiter oben verlinkt ist), mit meinem Kommentar:

Code: Alles auswählen

    if (dir.exists())
    {
       QuaZip zip(zipfile); //öffnen eines zipfiles
       if(!zip.open(QuaZip::mdCreate)) {
       qWarning("testCreate(): zip.open(): %d", zip.getZipError());
       return false;
       }

      QFile inFile;
      QuaZipFile outFile(&zip);
      const QFileInfoList list = dir.entryInfoList();
      QFileInfo fi;

      for (int l = 0; l < list.size(); l++)
      {
         fi = list.at(l);
         if (fi.isDir() && fi.fileName() != "." && fi.fileName() != "..") {
             /* dir */
         }  else if (fi.isFile() and fi.fileName() != zipfile ) {
             // TODO: CoPrint(QString("File on dirzip : %1").arg( fi.fileName() ),1);
              QDir::setCurrent(dir.absolutePath());
               inFile.setFileName(fi.fileName());
               if(!inFile.open(QIODevice::ReadOnly)) {
                  qWarning("testCreate(): inFile.open(): %s", inFile.errorString().toLocal8Bit().constData());
                   return false;
                }
               if(!outFile.open(QIODevice::WriteOnly, QuaZipNewInfo(inFile.fileName(), inFile.fileName()))) {
               qWarning("testCreate(): outFile.open(): %d", outFile.getZipError());
               return false;
               }
                while(inFile.getChar(&c)&&outFile.putChar(c));
                if(outFile.getZipError()!=UNZ_OK) {
                  qWarning("testCreate(): outFile.putChar(): %d", outFile.getZipError());
                  return false;
                }
                outFile.close();
                if(outFile.getZipError()!=UNZ_OK) {
                  qWarning("testCreate(): outFile.close(): %d", outFile.getZipError());
                  return false;
                }
                inFile.close();
         }
      }
        zip.close();//schließen eines zipfiles
Aber bei diesem (für mich etwas) großen Schritt war ich noch nicht gedanklich angekommen gewesen. :)
AQtNewbie
Beiträge: 23
Registriert: 1. Oktober 2012 13:03

Re: quazip

Beitrag von AQtNewbie »

Hier vielleicht eine kleine Hilfe, eine funktionierende Lösung zum Umgang mit quazip, die ich selbst geschrieben habe:
Hier wird ein Verzeichnis so verpackt, dass die Unterordnerstruktur bleibt.

Code: Alles auswählen

    //get user input WHERE to save the zip
    QString zipPath = ui->lineEdit->text();
    // create zip
    QuaZip* zip  = new QuaZip(zipPath);
    QString zipName = "test.zip";
    zip->setZipName(zipPath + zipName);

    // try to open
    if(!zip->open(QuaZip::mdCreate))
    {
        delete zip;
        std::cout << "open() failed. Is the path write correctly?" << std::endl;
        return;
    }

    //get directory TO zip
    QString testDir = ui->lineEdit1->text();
    JlCompress::compressDir(zip->getZipName(),testDir,true);
 
    // close zip
    zip->close();
    if(zip->getZipError()!=0)
    {
        delete zip;
        std::cout << "close() failed." << std::endl;
        return;
    }
    delete zip;
}
Antworten