Qt-QtZipWriter压缩文件与解压文件

 

.pro

 1 QT       += core gui
 2 QT       += gui-private
 3 
 4 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 5 
 6 CONFIG += c++11
 7 
 8 # The following define makes your compiler emit warnings if you use
 9 # any Qt feature that has been marked deprecated (the exact warnings
10 # depend on your compiler). Please consult the documentation of the
11 # deprecated API in order to know how to port your code away from it.
12 DEFINES += QT_DEPRECATED_WARNINGS
13 
14 # You can also make your code fail to compile if it uses deprecated APIs.
15 # In order to do so, uncomment the following line.
16 # You can also select to disable deprecated APIs only up to a certain version of Qt.
17 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
18 
19 SOURCES += \
20     ZZipWriter.cpp \
21     main.cpp \
22     mainwindow.cpp
23 
24 HEADERS += \
25     ZZipWriter.h \
26     mainwindow.h
27 
28 FORMS += \
29     mainwindow.ui
30 
31 # Default rules for deployment.
32 qnx: target.path = /tmp/$${TARGET}/bin
33 else: unix:!android: target.path = /opt/$${TARGET}/bin
34 !isEmpty(target.path): INSTALLS += target

 

main.cpp

 1 #include "mainwindow.h"
 2 
 3 #include <QApplication>
 4 
 5 int main(int argc, char *argv[])
 6 {
 7     QApplication a(argc, argv);
 8     MainWindow w;
 9     w.show();
10     return a.exec();
11 }

 

mainwindow.h

 1 #ifndef MAINWINDOW_H
 2 #define MAINWINDOW_H
 3 
 4 #include <QMainWindow>
 5 
 6 #include <ZZipWriter.h>
 7 
 8 QT_BEGIN_NAMESPACE
 9 namespace Ui { class MainWindow; }
10 QT_END_NAMESPACE
11 
12 class MainWindow : public QMainWindow
13 {
14     Q_OBJECT
15 
16 public:
17     MainWindow(QWidget *parent = nullptr);
18     ~MainWindow();
19 
20 private slots:
21     void on_pushButton_clicked();
22 
23     void on_pushButton_2_clicked();
24 
25 private:
26     Ui::MainWindow *ui;
27 };
28 #endif // MAINWINDOW_H

 

mainwindow.cpp

 1 #include "mainwindow.h"
 2 #include "ui_mainwindow.h"
 3 
 4 MainWindow::MainWindow(QWidget *parent)
 5     : QMainWindow(parent)
 6     , ui(new Ui::MainWindow)
 7 {
 8     ui->setupUi(this);
 9     this->setWindowTitle(QStringLiteral("QtZipWriter压缩文件与解压文件"));
10 }
11 
12 MainWindow::~MainWindow()
13 {
14     delete ui;
15 }
16 
17 
18 void MainWindow::on_pushButton_clicked()
19 {
20     QString folderPath = "C:/zhujq/testzip"; // 文件夹路径
21     QString zipFilePath = "C:/zhujq/"; // 输出ZIP文件路径
22 
23     ZJQZipWriter *ZZipWriter = new ZJQZipWriter(nullptr);
24     ZZipWriter->CompressionFile(folderPath, zipFilePath);
25 }
26 
27 void MainWindow::on_pushButton_2_clicked()
28 {
29     QString filePath = "C:/zhujq/testzip.zip";
30     QString zipPath = "C:/zhujq/testzip2";
31 
32     ZJQZipWriter *ZZipWriter = new ZJQZipWriter(nullptr);
33     ZZipWriter->DecompressFile(filePath, zipPath);
34 }

 

mainwindow.ui

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <ui version="4.0">
 3  <class>MainWindow</class>
 4  <widget class="QMainWindow" name="MainWindow">
 5   <property name="geometry">
 6    <rect>
 7     <x>0</x>
 8     <y>0</y>
 9     <width>384</width>
10     <height>189</height>
11    </rect>
12   </property>
13   <property name="windowTitle">
14    <string>MainWindow</string>
15   </property>
16   <widget class="QWidget" name="centralwidget">
17    <layout class="QVBoxLayout" name="verticalLayout_3">
18     <item>
19      <layout class="QHBoxLayout" name="horizontalLayout">
20       <item>
21        <layout class="QVBoxLayout" name="verticalLayout">
22         <item>
23          <widget class="QLineEdit" name="lineEdit">
24           <property name="text">
25            <string>C:/zhujq/testzip</string>
26           </property>
27          </widget>
28         </item>
29         <item>
30          <widget class="QLineEdit" name="lineEdit_2">
31           <property name="text">
32            <string>C:/zhujq/</string>
33           </property>
34          </widget>
35         </item>
36        </layout>
37       </item>
38       <item>
39        <widget class="QPushButton" name="pushButton">
40         <property name="text">
41          <string>压缩</string>
42         </property>
43        </widget>
44       </item>
45      </layout>
46     </item>
47     <item>
48      <layout class="QHBoxLayout" name="horizontalLayout_2">
49       <item>
50        <layout class="QVBoxLayout" name="verticalLayout_2">
51         <item>
52          <widget class="QLineEdit" name="lineEdit_3">
53           <property name="text">
54            <string>C:/zhujq/testzip.zip</string>
55           </property>
56          </widget>
57         </item>
58         <item>
59          <widget class="QLineEdit" name="lineEdit_4">
60           <property name="text">
61            <string>C:/zhujq/testzip2</string>
62           </property>
63          </widget>
64         </item>
65        </layout>
66       </item>
67       <item>
68        <widget class="QPushButton" name="pushButton_2">
69         <property name="text">
70          <string>解压</string>
71         </property>
72        </widget>
73       </item>
74      </layout>
75     </item>
76    </layout>
77   </widget>
78  </widget>
79  <resources/>
80  <connections/>
81 </ui>

 

ZZipWriter.h

 1 #ifndef ZZIPWRITER_H
 2 #define ZZIPWRITER_H
 3 
 4 #include <QObject>
 5 #include <QtGui/private/qzipreader_p.h>
 6 #include <QtGui/private/qzipwriter_p.h>
 7 #include <QDir>
 8 #include <QFileInfo>
 9 #include <QFile>
10 #include <QDebug>
11 
12 class ZJQZipWriter : public QObject
13 {
14 public:
15     ZJQZipWriter(QObject *parent = nullptr);
16 
17     void CompressionFile(QString srcFolderPath, QString destFolderPath);
18     QFileInfoList ErgodicFile(QZipWriter *writer, QString rootPath, QString filePath);
19 
20 
21    void DecompressFile(QString srcFile, QString destFolderPath);
22 
23 };
24 
25 #endif // ZZIPWRITER_H

 

ZZipWriter.cpp 

  1 #include "ZZipWriter.h"
  2 
  3 ZJQZipWriter::ZJQZipWriter(QObject *parent)
  4     :QObject(parent)
  5 {
  6 
  7 }
  8 
  9 void ZJQZipWriter::CompressionFile(QString srcFolderPath, QString destFolderPath)
 10 {
 11        if(srcFolderPath == nullptr || destFolderPath == nullptr)
 12        {
 13            // 路径为空
 14            return;
 15        }
 16        QFileInfo fileDistInfo(destFolderPath);
 17        if(fileDistInfo.isFile())   //目的路径不能为文件名
 18        {
 19            // 路径不能为文件
 20            return;
 21        }
 22        QFileInfo fileInfo(srcFolderPath);
 23        if(fileInfo.isFile()) // 压缩的是一个文件
 24        {
 25            QString saveFileName = destFolderPath + "/" + fileInfo.baseName() + ".zip";
 26            QZipWriter *oZipWriter = new QZipWriter(saveFileName);
 27            QFile file(srcFolderPath);
 28            if(!file.open(QIODevice::ReadOnly))
 29            {
 30                // 文件打开失败
 31                return;
 32            }
 33            oZipWriter->addFile(file.fileName(), file.readAll());
 34            oZipWriter->close();
 35            delete oZipWriter;
 36            oZipWriter = nullptr;
 37        }
 38        else    //压缩的是一个文件夹
 39        {
 40            QString folderStr = srcFolderPath.mid(srcFolderPath.lastIndexOf("/")).remove("/");
 41            if(folderStr == nullptr)
 42            {
 43                // 压缩文件路径错误
 44                return;
 45            }
 46            QString saveFileName = destFolderPath+"/"+folderStr+".zip";
 47            QZipWriter *oZipWriter = new QZipWriter(saveFileName);
 48            oZipWriter->addDirectory(folderStr);
 49            ErgodicFile(oZipWriter, folderStr, srcFolderPath);
 50            delete oZipWriter;
 51            oZipWriter = nullptr;
 52        }
 53 }
 54 
 55 QFileInfoList ZJQZipWriter::ErgodicFile(QZipWriter *writer, QString rootPath, QString filePath)
 56 {
 57     QDir dir(filePath);        //遍历各级子目录
 58     QDir fileDir(filePath);    //遍历子目录中所有文件
 59 
 60     //先遍历文件夹 添加进widget
 61     QFileInfoList fileList=dir.entryInfoList(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
 62     QFileInfoList folderList = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);   //获取当前所有目录 QDir::Dirs 0x001 列出目录;
 63 
 64     for(int i = 0; i != folderList.size(); i++)         //自动递归添加各目录到上一级目录
 65     {
 66         QString namepath = folderList.at(i).absoluteFilePath();    //获取路径
 67         QFileInfo folderinfo= folderList.at(i);
 68         QString name=folderinfo.fileName();      //获取目录名
 69 
 70 
 71         QStringList list = folderinfo.absoluteFilePath().split(rootPath);
 72         //qDebug()<<"Dir:"<<folderinfo.absoluteFilePath().remove(list.at(0));
 73         writer->addDirectory(folderinfo.absoluteFilePath().remove(list.at(0)));
 74 
 75         QFileInfoList child_file_list = ErgodicFile(writer,rootPath,namepath);          //进行递归 递归这个文件夹
 76         fileList.append(child_file_list);
 77         //  file_list.append(name);
 78 
 79     }
 80     /*添加path路径文件*/
 81 
 82     fileDir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);        //获取当前所有文件
 83     fileDir.setSorting(QDir::Name);
 84     QFileInfoList _fileList = fileDir.entryInfoList();
 85     for (int i = 0; i < _fileList.size(); ++i) //将当前目录中所有文件添加到treewidget中
 86     {
 87         QFileInfo fileInfo = _fileList.at(i);
 88 
 89         QFile file(fileInfo.absoluteFilePath());
 90         if(file.open(QIODevice::ReadOnly))
 91         {
 92             QStringList list = fileInfo.absoluteFilePath().split(rootPath);
 93             //qDebug()<<"File:"<<fileInfo.absoluteFilePath().remove(list.at(0));
 94             writer->addFile(fileInfo.absoluteFilePath().remove(list.at(0)),file.readAll());
 95             file.close();
 96         }
 97 
 98     }
 99     return fileList;
100 }
101 
102 void ZJQZipWriter::DecompressFile(QString srcFile, QString destFolderPath)
103 {
104     if(srcFile == nullptr || destFolderPath == nullptr)
105     {
106         // 路径为空
107         return;
108     }
109     // 处理目录不存在时,创建一个
110     QDir dir;
111     dir.mkpath(destFolderPath);
112     // 判断目录是否存在
113     QFileInfo destInfo(destFolderPath);
114     if(destInfo.isFile()||!destInfo.exists())
115     {
116         // 目的路径异常
117         return;
118     }
119 
120     QFileInfo fileInfo(srcFile);
121     if(!fileInfo.isFile() || fileInfo.suffix() !="zip")
122     {
123         // 压缩文件为空
124         return;
125     }
126 
127     QZipReader *oZipReader = new QZipReader(srcFile);
128     bool res = oZipReader->extractAll(destFolderPath);
129     if(res) //解压缩成功
130     {
131          // 解压缩完成
132     }
133     else
134     {
135          // 解压缩失败
136     }
137 
138     oZipReader->close();
139     delete oZipReader;
140     oZipReader = nullptr;
141 }

 

posted on 2026-02-02 15:20  疯狂delphi  阅读(0)  评论(0)    收藏  举报

导航