Замена текста путём Unzip/Zip
Задача - заменить текст в ODT файле. В .net я это делаю просто: распаковываю файл в папку, меняю текст, затем папку пакую обратно в файл. Может в Qt есть для этого специальный класс?
Нашел вот это, но тут упаковка/распаковка файл производится, а нужна упаковка/распаковка папки.
void Zip (QString filename , QString zipfilename){
QFile infile(filename);
QFile outfile(zipfilename);
infile.open(QIODevice::ReadOnly);
outfile.open(QIODevice::WriteOnly);
QByteArray uncompressedData = infile.readAll();
QByteArray compressedData = qCompress(uncompressedData,9);
outfile.write(compressedData);
infile.close();
outfile.close();
}
void Unzip (QString zipfilename , QString filename){
QFile infile(zipfilename);
QFile outfile(filename);
infile.open(QIODevice::ReadOnly);
outfile.open(QIODevice::WriteOnly);
QByteArray uncompressedData = infile.readAll();
QByteArray compressedData = qUncompress(uncompressedData);
outfile.write(compressedData);
infile.close();
outfile.close();
}
Ответы (1 шт):
Автор решения: Sergey Tatarincev
→ Ссылка
В Qt есть классы QZipReader и QZipWriter, правда они приватные и подключать их надо несколько нестандартно.
В общем и целом ваша задача "на минималках" решается так (контроль ошибок, чистку временного каталога думаю добавите сами):
#include <QDebug>
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDir>
#include <QFileInfo>
#if QT_VERSION == 0x050402
// Проверяйте версию Qt
#include <5.4.2/QtGui/private/qzipwriter_p.h>
#include <5.4.2/QtGui/private/qzipreader_p.h>
#endif
// Для простоты сразу объявим файл, который будем крыжить и временный каталог, куда будем распаковывать
#define MYFILE "/home/arise/file.odt"
#define MYDIR "/home/arise/temp/"
/* Получение списка файлов в архиве
* QString filename - имя архива
*/
QStringList MainWindow::listZip(QString filename){
QZipReader zr(filename);
QList<QZipReader::FileInfo> files;
files=zr.fileInfoList();
QStringList res;
foreach (QZipReader::FileInfo file, files)
res.append(file.filePath);
return res;
}
/* Распаковка архива
* QString filename, - имя архива
* QString extractTo, - каталог для распаковки
* QStringList filesToExtract - список файлов для распаковки (если пустой, извлекать все)
*/
void MainWindow::extractZip(QString filename, QString extractTo, QStringList filesToExtract){
QZipReader zr(filename);
if(filesToExtract.isEmpty())
filesToExtract = listZip(filename);
foreach (QString file, filesToExtract) {
QByteArray data = zr.fileData(file);
QFile f(QString("%1/%2").arg(extractTo).arg(file));
QFileInfo fi(f.fileName());
QDir dir;
dir.mkpath(fi.absolutePath());
f.open(QIODevice::WriteOnly);
f.write(data);
f.close();
}
}
/* Создание архива
* QString zipname, - имя архива
* QString basePath, - Каталог, в котором располагаются файлы для упаковки
* QStringList filesToZip - список файлов для добавления в архив
*/
void MainWindow::createZip(QString zipname, QString basePath, QStringList filesToZip){
QZipWriter zw(zipname,QFile::exists(zipname)?QIODevice::Truncate:QIODevice::WriteOnly);
foreach (QString file, filesToZip) {
QFile f(QString("%1/%2").arg(basePath).arg(file));
QFileInfo fi;
fi.setFile(file);
f.open(QIODevice::ReadOnly);
zw.addDirectory(fi.path());
zw.addFile(fi.fileName(),&f);
f.close();
}
zw.close();
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QStringList f = listZip(MYFILE);
extractZip(MYFILE,MYDIR);
QFile content(QString("%1/%2").arg(MYDIR).arg("content.xml"));
content.open(QIODevice::ReadOnly);
QByteArray data = content.readAll();
data = data.replace("Договор", "CONTRACT");
content.close();
content.open(QIODevice::WriteOnly);
content.write(data);
content.close();
createZip(QString("%1_new.odt").arg(MYFILE),MYDIR,f);
}
MainWindow::~MainWindow()
{
delete ui;
}