quazip

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

quazip

Beitrag von Erni35 » 31. März 2010 11:24

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 » 31. März 2010 11:47

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 » 31. März 2010 18:56

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 » 10. Oktober 2012 10:38

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 » 10. Oktober 2012 10:53

Mani's Hinweis passt.

Danke,
Erni35

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

Re: quazip

Beitrag von AQtNewbie » 10. Oktober 2012 12:06

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: 264
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: quazip

Beitrag von veeman » 10. Oktober 2012 17:02

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
mfg veeman

mage-dev

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

Re: quazip

Beitrag von AQtNewbie » 11. Oktober 2012 08:13

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 » 30. Oktober 2012 09:18

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