quazip
quazip
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
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
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?
2. Warum postest du dein problem in "Snippets, Tipps & Tricks"?
3. Hast du diesen beitrag schon gelesen?
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"));
3. Hast du diesen beitrag schon gelesen?
-
- Beiträge: 190
- Registriert: 18. Juni 2008 09:52
- Wohnort: Hamburg
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:
tschüß
Troll.Soft
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().
Troll.Soft
Re: quazip
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.
Ich habe selbst einige Recherchen angestellt und mich letztlich auch für QuaZip entschieden.
Meiner Meinung nach die beste Hilfestellung in diesem Thread.Mani99 hat geschrieben: 3. Hast du diesen beitrag schon gelesen?
Re: quazip
Mani's Hinweis passt.
Danke,
Erni35
Danke,
Erni35
Re: quazip
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.
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.
Re: quazip
Ausprobieren?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.
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
Re: quazip
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:
Aber bei diesem (für mich etwas) großen Schritt war ich noch nicht gedanklich angekommen gewesen.
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
Re: quazip
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.
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;
}