30 static bool copyData(QIODevice &inFile, QIODevice &outFile) {
31 while (!inFile.atEnd()) {
33 qint64 readLen = inFile.read(buf, 4096);
34 if (readLen <= 0)
return false;
35 if (outFile.write(buf, readLen) != readLen)
return false;
40 bool JlCompress::compressFile(
QuaZip *zip, QString fileName, QString fileDest) {
46 if (!zip)
return false;
53 inFile.setFileName(fileName);
54 if (!inFile.open(QIODevice::ReadOnly))
return false;
58 if (!outFile.open(QIODevice::WriteOnly,
63 if (!
copyData(inFile, outFile) || outFile.getZipError() !=
UNZ_OK) {
69 if (outFile.getZipError() !=
UNZ_OK)
return false;
75 bool JlCompress::compressSubDir(
QuaZip *zip,
79 QDir::Filters filters) {
86 if (!zip)
return false;
93 if (!directory.exists())
return false;
95 QDir origDirectory(origDir);
111 QFileInfoList files = directory.entryInfoList(
112 QDir::AllDirs | QDir::NoDotAndDotDot | filters);
113 Q_FOREACH (QFileInfo file, files) {
115 if (!compressSubDir(zip, file.absoluteFilePath(), origDir,
122 QFileInfoList files = directory.entryInfoList(QDir::Files | filters);
123 Q_FOREACH (QFileInfo file, files) {
125 if (!file.isFile() || file.absoluteFilePath() == zip->
getZipName())
130 origDirectory.relativeFilePath(file.absoluteFilePath());
133 if (!compressFile(zip, file.absoluteFilePath(),
filename))
return false;
139 bool JlCompress::extractFile(
QuaZip *zip, QString fileName, QString fileDest) {
145 if (!zip)
return false;
151 if (!inFile.open(QIODevice::ReadOnly) || inFile.getZipError() !=
UNZ_OK)
156 if (fileDest.endsWith(
'/')) {
157 if (!curDir.mkpath(fileDest)) {
161 if (!curDir.mkpath(QFileInfo(fileDest).absolutePath())) {
170 if (fileDest.endsWith(
'/') && QFileInfo(fileDest).isDir()) {
172 QFile(fileDest).setPermissions(srcPerm);
179 outFile.setFileName(fileDest);
180 if (!outFile.open(QIODevice::WriteOnly))
return false;
183 if (!
copyData(inFile, outFile) || inFile.getZipError() !=
UNZ_OK) {
185 removeFile(QStringList(fileDest));
192 if (inFile.getZipError() !=
UNZ_OK) {
193 removeFile(QStringList(fileDest));
198 outFile.setPermissions(srcPerm);
203 bool JlCompress::removeFile(QStringList listFile) {
206 for (
int i = 0; i < listFile.count(); i++) {
208 ret = ret && QFile::remove(listFile.at(i));
213 bool JlCompress::compressFile(QString fileCompressed, QString file) {
215 QuaZip zip(fileCompressed);
216 QDir().mkpath(QFileInfo(fileCompressed).absolutePath());
218 QFile::remove(fileCompressed);
223 if (!compressFile(&zip, file, QFileInfo(file).fileName())) {
224 QFile::remove(fileCompressed);
231 QFile::remove(fileCompressed);
240 QuaZip zip(fileCompressed);
241 QDir().mkpath(QFileInfo(fileCompressed).absolutePath());
243 QFile::remove(fileCompressed);
249 Q_FOREACH (QString file, files) {
251 if (!info.exists() || !compressFile(&zip, file, info.fileName())) {
252 QFile::remove(fileCompressed);
260 QFile::remove(fileCompressed);
270 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
271 return compressDir(fileCompressed, dir, recursive, QDir::NoFilter);
273 return compressDir(fileCompressed, dir, recursive, 0);
280 QDir::Filters filters) {
282 QuaZip zip(fileCompressed);
283 QDir().mkpath(QFileInfo(fileCompressed).absolutePath());
285 QFile::remove(fileCompressed);
290 if (!compressSubDir(&zip, dir, dir, recursive, filters)) {
291 QFile::remove(fileCompressed);
298 QFile::remove(fileCompressed);
305 QString JlCompress::extractFile(QString fileCompressed,
309 QuaZip zip(fileCompressed);
310 return extractFile(zip, fileName, fileDest);
313 QString JlCompress::extractFile(
QuaZip &zip,
321 if (fileDest.isEmpty()) fileDest = fileName;
322 if (!extractFile(&zip, fileName, fileDest)) {
329 removeFile(QStringList(fileDest));
332 return QFileInfo(fileDest).absoluteFilePath();
335 QStringList JlCompress::extractFiles(QString fileCompressed,
339 QuaZip zip(fileCompressed);
340 return extractFiles(zip, files, dir);
343 QStringList JlCompress::extractFiles(
QuaZip &zip,
344 const QStringList &files,
345 const QString &dir) {
347 return QStringList();
351 QStringList extracted;
352 for (
int i = 0; i < files.count(); i++) {
353 QString absPath = QDir(dir).absoluteFilePath(files.at(i));
354 if (!extractFile(&zip, files.at(i), absPath)) {
355 removeFile(extracted);
356 return QStringList();
358 extracted.append(absPath);
364 removeFile(extracted);
365 return QStringList();
371 QStringList JlCompress::extractDir(QString fileCompressed, QString dir) {
373 QuaZip zip(fileCompressed);
374 return extractDir(zip, dir);
377 QStringList JlCompress::extractDir(
QuaZip &zip,
const QString &dir) {
379 return QStringList();
383 QStringList extracted;
385 return QStringList();
389 QString absFilePath = directory.absoluteFilePath(
name);
390 if (!extractFile(&zip,
"", absFilePath)) {
391 removeFile(extracted);
392 return QStringList();
394 extracted.append(absFilePath);
400 removeFile(extracted);
401 return QStringList();
407 QStringList JlCompress::getFileList(QString fileCompressed) {
409 QuaZip *zip =
new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
410 return getFileList(zip);
413 QStringList JlCompress::getFileList(
QuaZip *zip) {
416 return QStringList();
425 return QStringList();
435 return QStringList();
441 QStringList JlCompress::extractDir(QIODevice *ioDevice, QString dir) {
443 return extractDir(zip, dir);
446 QStringList JlCompress::getFileList(QIODevice *ioDevice) {
448 return getFileList(zip);
451 QString JlCompress::extractFile(QIODevice *ioDevice,
455 return extractFile(zip, fileName, fileDest);
458 QStringList JlCompress::extractFiles(QIODevice *ioDevice,
462 return extractFiles(zip, files, dir);
static bool copyData(QIODevice &inFile, QIODevice &outFile)
static bool compressDir(QString fileCompressed, QString dir=QString(), bool recursive=true)
Compress a whole directory.
static bool compressFiles(QString fileCompressed, QStringList files)
Compress a list of files.
A file inside ZIP archive.
QString getZipName() const
Returns the name of the ZIP file.
@ mdAdd
ZIP file was opened for adding files in the archive.
@ mdCreate
ZIP file was created with open() call.
@ mdUnzip
ZIP file is open for reading files inside it.
Mode getMode() const
Returns the mode in which ZIP file was opened.
bool setCurrentFile(const QString &fileName, CaseSensitivity cs=csDefault)
Sets current file by its name.
bool goToFirstFile()
Sets the current file to the first file in the archive.
void close()
Closes ZIP file.
QString getCurrentFileName() const
Returns the current file name.
int getZipError() const
Returns the error code of the last operation.
bool open(Mode mode, zlib_filefunc_def *ioApi=NULL)
Opens ZIP file.
bool getCurrentFileInfo(QuaZipFileInfo *info) const
Retrieves information about the current file.
bool goToNextFile()
Sets the current file to the next file in the archive.
Information about a file inside archive (with zip64 support).
QFile::Permissions getPermissions() const
Get the file permissions.
Information about a file to be created.