GH-881 Include a top-level directory in exported instances
This commit is contained in:
parent
6775e3e72b
commit
c088d3bef0
@ -22,6 +22,10 @@
|
|||||||
|
|
||||||
QString PathCombine(QString path1, QString path2)
|
QString PathCombine(QString path1, QString path2)
|
||||||
{
|
{
|
||||||
|
if(!path1.size())
|
||||||
|
return path2;
|
||||||
|
if(!path2.size())
|
||||||
|
return path1;
|
||||||
return QDir::cleanPath(path1 + QDir::separator() + path2);
|
return QDir::cleanPath(path1 + QDir::separator() + path2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1458,13 +1458,101 @@ void MainWindow::on_actionDeleteInstance_triggered()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include <pathutils.h>
|
||||||
|
|
||||||
|
bool compressSubDir(QuaZip* zip, QString dir, QString origDir, QString prefix)
|
||||||
|
{
|
||||||
|
if (!zip) return false;
|
||||||
|
if (zip->getMode()!=QuaZip::mdCreate && zip->getMode()!=QuaZip::mdAppend && zip->getMode()!=QuaZip::mdAdd)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
QDir directory(dir);
|
||||||
|
if (!directory.exists()) return false;
|
||||||
|
|
||||||
|
QDir origDirectory(origDir);
|
||||||
|
if (dir != origDir)
|
||||||
|
{
|
||||||
|
QuaZipFile dirZipFile(zip);
|
||||||
|
auto dirPrefix = PathCombine(prefix, origDirectory.relativeFilePath(dir)) + "/";
|
||||||
|
if (!dirZipFile.open(QIODevice::WriteOnly, QuaZipNewInfo(dirPrefix, dir), 0, 0, 0))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
dirZipFile.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
QFileInfoList files = directory.entryInfoList(QDir::AllDirs | QDir::NoDotAndDotDot | QDir::Hidden);
|
||||||
|
for (auto file: files)
|
||||||
|
{
|
||||||
|
if(!compressSubDir(zip,file.absoluteFilePath(),origDir, prefix))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
files = directory.entryInfoList(QDir::Files);
|
||||||
|
for (auto file: files)
|
||||||
|
{
|
||||||
|
if(!file.isFile())
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(file.absoluteFilePath()==zip->getZipName())
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString filename = origDirectory.relativeFilePath(file.absoluteFilePath());
|
||||||
|
if(prefix.size())
|
||||||
|
{
|
||||||
|
filename = PathCombine(prefix, filename);
|
||||||
|
}
|
||||||
|
if (!JlCompress::compressFile(zip,file.absoluteFilePath(),filename))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool compressDir(QString zipFile, QString dir, QString prefix = QString())
|
||||||
|
{
|
||||||
|
QuaZip zip(zipFile);
|
||||||
|
QDir().mkpath(QFileInfo(zipFile).absolutePath());
|
||||||
|
if(!zip.open(QuaZip::mdCreate))
|
||||||
|
{
|
||||||
|
QFile::remove(zipFile);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
QSet<QString> added;
|
||||||
|
if (!compressSubDir(&zip,dir,dir,prefix))
|
||||||
|
{
|
||||||
|
QFile::remove(zipFile);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
zip.close();
|
||||||
|
if(zip.getZipError()!=0)
|
||||||
|
{
|
||||||
|
QFile::remove(zipFile);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::on_actionExportInstance_triggered()
|
void MainWindow::on_actionExportInstance_triggered()
|
||||||
{
|
{
|
||||||
if (m_selectedInstance)
|
if (m_selectedInstance)
|
||||||
{
|
{
|
||||||
|
auto name = RemoveInvalidFilenameChars(m_selectedInstance->name());
|
||||||
|
|
||||||
const QString output = QFileDialog::getSaveFileName(this, tr("Export %1")
|
const QString output = QFileDialog::getSaveFileName(this, tr("Export %1")
|
||||||
.arg(m_selectedInstance->name()),
|
.arg(m_selectedInstance->name()),
|
||||||
QDir::homePath(), "Zip (*.zip)");
|
PathCombine(QDir::homePath(), name + ".zip") , "Zip (*.zip)");
|
||||||
if (output.isNull())
|
if (output.isNull())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
@ -1478,7 +1566,8 @@ void MainWindow::on_actionExportInstance_triggered()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!JlCompress::compressDir(output, m_selectedInstance->instanceRoot()))
|
|
||||||
|
if (!compressDir(output, m_selectedInstance->instanceRoot(), name))
|
||||||
{
|
{
|
||||||
QMessageBox::warning(this, tr("Error"), tr("Unable to export instance"));
|
QMessageBox::warning(this, tr("Error"), tr("Unable to export instance"));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user