dialogdbbackupandrecovery.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #include "dialogdbbackupandrecovery.h"
  2. #include "ui_dialogdbbackupandrecovery.h"
  3. #include "sncdatabase.h"
  4. #include "zip.h"
  5. #include "unzip.h"
  6. DialogDbBackupAndRecovery::DialogDbBackupAndRecovery(QWidget *parent) :
  7. QDialog(parent),
  8. ui(new Ui::DialogDbBackupAndRecovery)
  9. {
  10. ui->setupUi(this);
  11. }
  12. DialogDbBackupAndRecovery::~DialogDbBackupAndRecovery()
  13. {
  14. delete ui;
  15. }
  16. void DialogDbBackupAndRecovery::on_pushButtonBackup_clicked()
  17. {
  18. QFileDialog::Options options;
  19. QString selectedFilter;
  20. QString exportDir = SNCDataBase::getExportDir();
  21. if(exportDir.isEmpty())
  22. {
  23. exportDir = QDesktopServices::storageLocation(QDesktopServices::DesktopLocation);
  24. }
  25. QString zipName = QFileDialog::getSaveFileName(this,
  26. "备份文件",exportDir,
  27. tr("Backup Files (*.bak)"),
  28. &selectedFilter,
  29. options);
  30. QStringList files;
  31. QString dbdir;
  32. dbdir=QCoreApplication::applicationDirPath();
  33. QString sysdbfile = dbdir+"/sys.db";
  34. QString userdbfile = dbdir+"/../data/user.db";
  35. QString msegdbfile = dbdir + "/mseg.db";
  36. files<<sysdbfile<<userdbfile<<msegdbfile;
  37. if(!zipName.isEmpty())
  38. {
  39. setCursor(Qt::WaitCursor);
  40. if(addFileToZip(zipName,files))
  41. {
  42. QMessageBox::information(this, tr("提示"),QString(tr("数据备份成功!")),QMessageBox::Ok );
  43. }
  44. else
  45. {
  46. QMessageBox::critical(this, tr("提示"),QString(tr("数据备份失败!")),QMessageBox::Ok );
  47. }
  48. setCursor(Qt::ArrowCursor);
  49. }
  50. else
  51. return ;
  52. }
  53. bool DialogDbBackupAndRecovery::addFileToZip(QString zipName, QStringList files)
  54. {
  55. Zip::ErrorCode ec;
  56. Zip uz;
  57. QFile file(zipName);
  58. if(!file.open(QIODevice::WriteOnly)){
  59. return false ;
  60. }
  61. file.close();
  62. ec = uz.createArchive(zipName);
  63. if (ec != Zip::Ok) {
  64. return false;
  65. }
  66. ec = uz.addFiles(files);
  67. if (ec != Zip::Ok) {
  68. uz.closeArchive();
  69. return false;
  70. }
  71. if (uz.closeArchive() != Zip::Ok) {
  72. return false;
  73. }
  74. return true;
  75. }
  76. void DialogDbBackupAndRecovery::on_pushButtonRecovery_clicked()
  77. {
  78. QFileDialog::Options options;
  79. //options |= QFileDialog::con;
  80. QString selectedFilter;
  81. QString exportDir = SNCDataBase::getExportDir();
  82. if(exportDir.isEmpty())
  83. {
  84. exportDir = QDesktopServices::storageLocation(QDesktopServices::DesktopLocation);
  85. }
  86. QString zipName = QFileDialog::getOpenFileName(this,
  87. "恢复文件",exportDir,
  88. tr("Backup Files (*.bak)"),
  89. &selectedFilter,
  90. options);
  91. if(!zipName.isEmpty())
  92. {
  93. if(QMessageBox::Yes ==QMessageBox::question(this,"确认","确定进行数据恢复吗?",\
  94. QMessageBox::Yes,QMessageBox::No))
  95. {
  96. if(unzip(zipName))
  97. {
  98. QMessageBox::information(this, tr("提示"),QString(tr("数据恢复成功,请重新启动程序后生效!")),\
  99. QMessageBox::Ok );
  100. }
  101. else
  102. {
  103. QMessageBox::critical(this, tr("提示"),QString(tr("数据恢复失败!")),QMessageBox::Ok );
  104. }
  105. }
  106. }
  107. }
  108. bool DialogDbBackupAndRecovery::unzip(QString zipfile)
  109. {
  110. UnZip::ErrorCode ec;
  111. UnZip uz;
  112. QDir dir;
  113. if(!dir.exists(QDir::tempPath()+"/dbbak"))
  114. {
  115. dir.mkdir(QDir::tempPath()+"/dbbak");
  116. }
  117. else
  118. {
  119. //准备目录并删除该目录下的所有文件
  120. QDir dir(QDir::tempPath()+"/dbbak");
  121. QFileInfoList list = dir.entryInfoList();
  122. for(int i=0;i<list.size();i++)
  123. {
  124. if(list.at(i).isFile())
  125. {
  126. qDebug()<<"delete file :"<<list.at(i).absoluteFilePath();
  127. QFile::remove(list.at(i).absoluteFilePath());
  128. }
  129. }
  130. }
  131. ec = uz.openArchive(zipfile);
  132. if (ec != UnZip::Ok) {
  133. qDebug() << "Failed to open archive: " << uz.formatError(ec).toAscii().data() << endl << endl;
  134. return false ;
  135. }
  136. ec = uz.extractAll(QDir::tempPath()+"/dbbak");
  137. if (ec != UnZip::Ok) {
  138. qDebug() << "Extraction failed: " << uz.formatError(ec).toAscii().data() << endl << endl;
  139. uz.closeArchive();
  140. return false ;
  141. }
  142. QFile::copy(QDir::tempPath()+"/dbbak/sys.db",QCoreApplication::applicationDirPath()+"/sys.sncbak");
  143. QFile::copy(QDir::tempPath()+"/dbbak/mseg.db",QCoreApplication::applicationDirPath()+"/mseg.sncbak");
  144. QFile::copy(QDir::tempPath()+"/dbbak/user.db",QCoreApplication::applicationDirPath()+"/../data/user.sncbak");
  145. return true;
  146. }