1. 程式人生 > >使用Zlib對檔案和目錄進加密打包和解包

使用Zlib對檔案和目錄進加密打包和解包

   zlib就不做解釋了,本人使用的是1.2.7版本,並用C++進行了封裝,用到了Qt。

功能:

1.使用執行緒,不會卡死介面支.

2.支援遞迴目錄,目錄和單個檔案。

3.可以同時進行多項任務。

4.返回每項任務的任務進度。

5.打包和解包的詳細過程資訊。

6.支援從包檔案中只解壓一個檔案。

步驟:

1.下載zlib壓縮包並解壓。

2.找到zlib解壓目錄下的zlib-1.2.7\contrib\masmx64目錄,這裡是64位的,32位的目錄為zlib-1.2.7\contrib\masmx86。

3.啟動vs命令列工具如(VS2013 x64 本機工具命令提示) , 切換到步驟2的目錄。

4.將bld_ml64.bat拖到步驟3的命令列工具並執行。

5.執行步驟4後在zlib-1.2.7\contrib目錄下找到vstudio目錄,然後找到vc10目錄下的vs工程檔案開啟編譯生成zlib庫。

工程配置就不在囉嗦了, 類SCPackageMgr對每個打包或者解包任務進行管理,SCPackageWorker是實際工作的類,由於打包可能檔案很多很大,為了防止介面卡死,所以SCPackageWorker實際是個執行緒。這裡簡單的對每一個任務建立了一個執行緒,其實可以對任務進行分組,每個執行緒負責一組任務,這就留給讀者自己實現了。

標頭檔案:

/*************************************************

Copyright:北京四維(數創)科技有限公司
Author:
Date:2017-08-25
Description:對檔案或者目錄進行加密打包和解包
**************************************************/
#ifndefSCPACKAGEMGR_H
#defineSCPACKAGEMGR_H
#include<QObject>
#include<QVector>
#include<QThread>
#ifdef_WIN64
#defineZLIB_WINAPI
#endif
#include
"unzip.h"
#include"zip.h"
classSCPackageWorker;
classQThread;
typedefQVector<QString>FileList;
typedefQVector<QString>DirList;
typedefQVector<SCPackageWorker*>TaskList;
classSCPackageMgr:publicQObject
{
Q_OBJECT
public:
staticSCPackageMgr&instance();
/*************************************************
Function:addDir
Description:新增要打包的目錄
Input:dir,需要打包的目錄
Output:
Return:void
*************************************************/
voidaddDir(constQString&dir);
/*************************************************
Function:addFile
Description:新增要打包的檔案
Input:path,需要打包的檔案完整路徑
Output:
Return:void
*************************************************/
voidaddFile(constQString&path);
/*************************************************
Function:package
Description:開始打包,打包addDir和addFile新增的檔案和資料夾
Input:packagePath,打包後的檔案完整路徑如F:\1.zip
Input:passWord,對打包檔案進行加密的密碼
Input:level,壓縮級別(0-9),預設為9
Output:
Return:void
*************************************************/
voidpackage(constQString&packagePath,constQString&passWord="",intlevel=9);
/*************************************************
Function:unPackage
Description:解包一個壓縮包
Input:strPackageFilePath,需要解包的檔案路徑
Input:strUnPackageDir,解壓目錄
Input:password,密碼對應package打包的密碼
Output:
Return:void
*************************************************/
voidunPackage(constQString&strPackageFilePath,constQString&strUnPackageDir,constQString&password="");
/*************************************************
Function:unPackFileFromPackge
Description:解包壓縮包中特定的一個檔案
Input:strPackageFilePath,需要解包的檔案路徑
Input:strUnPackageDir,解壓目錄
Input:password,密碼對應package打包的密碼
Input:fileNameInPackage,該檔案在包中的名稱
Output:
Return:void
*************************************************/
voidunPackFileFromPackge(constQString&strPackageFilePath,
constQString&strUnPackageDir,
constQString&fileNameInPackage,
constQString&password="");
/*************************************************
Function:clear
Description:清空當前需要打包的內容,為下一次打包做準備,每次新新增目錄或者檔案呼叫
Input:
Output:
Return:void
*************************************************/
voidclear();
private:
SCPackageMgr();
SCPackageMgr(constSCPackageMgr&){}
~SCPackageMgr();
SCPackageMgr&operator=(constSCPackageMgr&){}
signals:
/*************************************************
Function:packageProgress
Description:通知打包的進度
Output:filePath,打包的目錄對應package引數1傳入的檔案路徑
Output:progress,進度。
Return:void
*************************************************/
voidpackageProgress(constQString&filePath,constQString&progress);
/*************************************************
Function:unPackageProgress
Description:通知解包的進度
Output:filePath,解包的目錄對應unPackage引數1傳入的檔案路徑
Output:progress,進度。
Return:void
*************************************************/
voidunPackageProgress(constQString&filePath,constQString&progress);
/*************************************************
Function:progressInfo
Description:解包或者打包的詳細資訊,如當前正在對某個檔案壓縮
Output:info,資訊
Return:void
*************************************************/
voidprogressInfo(constQString&info);
private:
//任務列表
TaskListm_tasks;
//需要打包的檔案列表
FileListm_files;
//需要打包的目錄列表
DirListm_dirs;
};
classSCPackageWorker:publicQThread
{
Q_OBJECT
enumWorkerType
{
PACKAGE_TYPE=1,
UNPACKAGE_TYPE,
UNPACKAGE_ONE_TYPE
};
private:
/*************************************************
Function:package
Description:開始打包,打包addDir和addFile新增的檔案和資料夾
Input:packagePath,打包後的檔案完整路徑如F:\1.zip
Input:passWord,對打包檔案進行加密的密碼
Input:level,壓縮級別(0-9),預設為9
Output:
Return:void
*************************************************/
voidpackage(constQString&packagePath,constQString&passWord,intlevel=9);
/*************************************************
Function:unPackage
Description:解包一個壓縮包
Input:strPackageFilePath,需要解包的檔案路徑
Input:strUnPackageDir,解壓目錄
Input:password,密碼對應package打包的密碼
Output:
Return:void
*************************************************/
voidunPackage(constQString&strPackageFilePath,constQString&strUnPackageDir,constQString&password);
/*************************************************
Function:unPackFileFromPackge
Description:解包壓縮包中特定的一個檔案
Input:strPackageFilePath,需要解包的檔案路徑
Input:strUnPackageDir,解壓目錄
Input:password,密碼對應package打包的密碼
Input:fileNameInPackage,該檔案在包中的名稱
Output:
Return:void
*************************************************/
voidunPackFileFromPackge(constQString&strPackageFilePath,
constQString&strUnPackageDir,
constQString&fileNameInPackage,
constQString&password);
private:
voidrun();
SCPackageWorker(){}
SCPackageWorker(constFileList&fileList,constDirList&dirList);
SCPackageWorker(constSCPackageWorker&){}
~SCPackageWorker(){}
SCPackageWorker&operator=(constSCPackageWorker&){}
/*************************************************
Function:packageByDir
Description:對指定目錄進行遞迴打包
Input:strPath,需要打包的目錄
Input:parentDir,父目錄
Input:password,密碼
Input:level,壓縮級別
Output:
Return:void
*************************************************/
voidpackageByDir(zipFilezf,constQString&strPath,constQString&parentDir,constQString&passWord,intlevel);
/*************************************************
Function:packageByFile
Description:對指定檔案行打包
Input:fileNameInPackage,指定打包的檔案在包檔案的名稱
Input:filePath,需要打包檔案的完整路徑
Input:password,密碼
Input:level,壓縮級別
Output:
Return:void
*************************************************/
voidpackageByFile(zipFilezf,constQString&fileNameInPackage,constQString&filePath,constQString&passWord,intlevel);
/*************************************************
Function:getDirFileCount
Description:獲取目錄下的檔案個數
Input:dir,需要計算的目錄
Input:count,檔案個數
Output:
Return:void
*************************************************/
voidgetDirFileCount(constQString&dir,int&count);
/*************************************************
Function:startPackage
Description:開始打包
Input:
Output:
Return:void
*************************************************/
voidstartPackage();
/*************************************************
Function:startUnPackage
Description:開始解包
Input:
Output:
Return:void
*************************************************/
voidstartUnPackage();
/*************************************************
Function:startUnPacgeOne
Description:解包一個
Input:
Output:
Return:void
*************************************************/
voidstartUnPacgeOne();
signals:
/*************************************************
Function:packageProgress
Description:通知打包的進度
Output:filePath,打包的目錄對應package引數1傳入的檔案路徑
Output:progress,進度。
Return:void
*************************************************/
voidpackageProgress(constQString&filePath,constQString&progress);
/*************************************************
Function:unPackageProgress
Description:通知解包的進度
Output:filePath,解包的目錄對應unPackage引數1傳入的檔案路徑
Output:progress,進度。
Return:void
*************************************************/
voidunPackageProgress(constQString&filePath,constQString&progress);
/*************************************************
Function:progressInfo
Description:解包或者打包的詳細資訊,如當前正在對某個檔案壓縮
Output:info,資訊
Return:void
*************************************************/
voidprogressInfo(constQString&info);
private:
//需要打包的檔案列表
FileListm_files;
//需要打包的目錄列表
DirListm_dirs;
//打包或者解包的檔案路徑,用於進度訊號發出
QStringm_strPackageFilePath;
QStringm_strUnPackageFilePath;
QStringm_strUnPackageDir;
QStringm_strPw;
intm_nlevel;
//要解壓的單個檔名
QStringm_strUnPackageOneFileName;
//上一次進度
QStringm_strLastProgress;
//打包檔案總個數
intm_nTasks;
//打包一個檔案所佔%
doublem_nProgerss;
//打包次數
intm_nLoopCount;
//解壓打包
WorkerTypem_WorkerType;
friendclassSCPackageMgr;
};

#endif//SCPACKAGEMGR_H




原始檔:

#include"SCPackageMgr.h"
#include<qt_windows.h>
#include<QDebug>
#include<QDir>
#include<QThread>
#include<iostream>
#include<fstream>
usingnamespacestd;
#defineFOPEN_FUNC(filename,mode)fopen(filename,mode)
#defineWRITEBUFFERSIZE(8192)
voidSCPackageMgr::clear()
{
m_dirs.clear();
m_files.clear();
}
SCPackageMgr&SCPackageMgr::instance()
{
staticSCPackageMgrmgr;
returnmgr;
}
voidSCPackageMgr::addDir(constQString&dir)
{
m_dirs.push_back(dir);
}
voidSCPackageMgr::addFile(constQString&path)
{
m_files.push_back(path);
}
voidSCPackageMgr::package(constQString&packagePath,constQString&passWord,intlevel)
{
SCPackageWorker*worker=newSCPackageWorker(m_files,m_dirs);
connect(worker,SIGNAL(packageProgress(constQString&,constQString&)),this,SIGNAL(packageProgress(constQString&,constQString&)));
worker->package(packagePath,passWord,level);
m_tasks.push_back(worker);
}
voidSCPackageMgr::unPackage(constQString&strPackageFilePath,constQString&strUnPackageDir,constQString&password)
{
SCPackageWorker*worker=newSCPackageWorker();
connect(worker,SIGNAL(unPackageProgress(constQString&,constQString&)),this,SIGNAL(unPackageProgress(constQString&,constQString&)));
worker->unPackage(strPackageFilePath,strUnPackageDir,password);
m_tasks.push_back(worker);
}
voidSCPackageMgr::unPackFileFromPackge(constQString&strPackageFilePath,constQString&strUnPackageDir,constQString&fileNameInPackage,constQString&password)
{
SCPackageWorker*worker=newSCPackageWorker();
connect(worker,SIGNAL(unPackageProgress(constQString&,constQString&)),this,SIGNAL(unPackageProgress(constQString&,constQString&)));
worker->unPackFileFromPackge(strPackageFilePath,strUnPackageDir,fileNameInPackage,password);
m_tasks.push_back(worker);
}
SCPackageMgr::SCPackageMgr()
{
}
SCPackageMgr::~SCPackageMgr()
{
foreach(SCPackageWorker*worker,m_tasks){
if(NULL!=worker){
worker->quit();
deleteworker;
worker=NULL;
}
}
}
voidSCPackageWorker::package(constQString&packagePath,constQString&passWord,intlevel)
{
m_WorkerType=PACKAGE_TYPE;
m_strPackageFilePath=packagePath;
m_strPw=passWord;
m_nlevel=level;
start();
}
voidSCPackageWorker::unPackage(constQString&strPackageFilePath,constQString&strUnPackageDir,constQString&password)
{
m_WorkerType=UNPACKAGE_TYPE;
m_strPackageFilePath=strPackageFilePath;
m_strUnPackageDir=strUnPackageDir;
m_strPw=password;
start();
}
voidSCPackageWorker::unPackFileFromPackge(constQString&strPackageFilePath,
constQString&strUnPackageDir,
constQString&fileNameInPackage,
constQString&password)
{
m_WorkerType=UNPACKAGE_ONE_TYPE;
m_strPackageFilePath=strPackageFilePath
            
           

相關推薦

使用Zlib檔案目錄加密打包和解

   zlib就不做解釋了,本人使用的是1.2.7版本,並用C++進行了封裝,用到了Qt。 功能: 1.使用執行緒,不會卡死介面支. 2.支援遞迴目錄,目錄和單個檔案。 3.可以同時進行多項任務。 4.返回每項任務的任務進度。 5.打包和解包的詳細過程資訊。

du---是檔案目錄磁碟使用的空間檢視

du命令也是檢視使用空間的,但是與df命令不同的是Linux du命令是對檔案和目錄磁碟使用的空間的檢視,還是和df命令有一些區別的。 語法 du [選項][檔案] 選項 -a或-all 顯示目錄中個別檔案的大小。 -b或-bytes 顯示目錄或檔案大小時,以byte為單位。 -c或--total 除

Python中檔案目錄的操作

用到的核心模組有:os   shutil 檔案的建立:f = open("檔名", "w")  注:如果涉及到亂碼問題需要在後面加上encoding="utf-8" 檔案內容的讀取:f = open("檔名", "r") 檔案的重新命名:os.rename("之前的

ant中檔案目錄進行復制刪除

4.5 Copy Task:對檔案和目錄進行復制 Copy 任務把一個或多個檔案複製到指定的目錄下。但要注意的是,如果目標目錄下具有同名的檔案,那麼只有當原始檔相對於目標檔案更新時,Ant工具才會複製這個檔案。在Copy任務中可以使用FileSet型別來定義檔案集合。 4.5.1 Copy Task的屬性及

tar---打包,解壓縮linux的檔案目錄

tar命令可以為linux的檔案和目錄建立檔案。利用tar,可以為某一特定檔案建立檔案(備份檔案),也可以在檔案中改變檔案,或者向檔案中加入新的檔案。tar最初被用來在磁帶上建立檔案,現在,使用者可以在任何裝置上建立檔案。利用tar命令,可以把一大堆的檔案和目錄全部打包成一個檔案,這對於備份檔案或將幾個檔案組

一:檔案目錄篇(5)——搜尋檔案

動作 roo 速度 ket 有關 -name comm 找不到 ont 1.搜尋執行檔——which which指令主要是在PATH所包含的目錄中去搜尋執行檔的檔名,若加上-a參數就可以搜尋除所有包含檔案的信息 上面列出root賬號的PATH包含的目錄,which命令會在

遞迴實現刪除某個資料夾下的所有檔案目錄,包括刪除本身。

核心程式碼:     /***      * 刪除指定資料夾下所有檔案      *      * @param path   

python3操作檔案目錄

操作檔案和目錄的函式一部分放在os模組中,一部分放在os.path模組中,這一點要注意一下。檢視、建立和刪除目錄可以這麼呼叫: # 檢視當前目錄的絕對路徑:>>> os.path.abspath('.')'/Users/michael'# 在某個目錄下建立一個新目錄,首先把新目錄的完整路徑

Node.js 中fs.access() 判斷檔案目錄是否存在;

var fs = require("fs"); /* -----判斷檔案和目錄是否存在; fs.access(path[, mode], callback); path:判斷的檔名; callback:回撥函式;  */ fs.access("./wenjian.txt",function

Linux 檔案目錄的讀寫執行許可權詳解

首先了解一個ls -l 檔案的每列含義 [[email protected] ~]# ls -l a -rw-r–rw- 1 test002 tester 279103 9月 2 13:21 a 下面介紹每列含義: (1)第一列:檔案型別和許可權,這部分稍後重

python遍歷目錄下的所有檔案目錄詳細介紹

目錄結構如下圖: test---a------d------g--------g.txt test---a------d------a.txt test---a------e --------b --------c --------1.txt --------2.tx

Linux學習筆記之1——檔案目錄管理(硬連線軟連線)(連結檔,相當於快捷方式)

在這節將要學習linux的連線檔,在之前用"ls -l" 檢視檔案屬性的命令時, 其中第二個屬性是連線數。那麼這個連線數是幹什麼的?這就要理解inode。     先說一下檔案是怎麼儲存的。檔案儲存在硬碟上,硬碟的最小儲存單位叫做"扇區"(Sector),每個扇區儲存512位元

APUE 檔案目錄

檔案和目錄 Unix 所有的檔案都對應一個 struct stat,包含了一個檔案所有的資訊。 #include <sys/stat.h> struct stat { mode_t st_mode; // 檔案型別和使用者訪問許可權 ino_t

易學筆記-Linux命令-第5章:操作檔案目錄

操作檔案和目錄 萬用字元 *:匹配任意多個字元(包括零個或者多個) [[email protected] ~]# ll -l *  列出所有檔案或者目錄,包括目錄中的子目錄或者子檔案 -rw-r--r--. 1 root root 

[UNIX環境高階程式設計] 檔案目錄

1 引言 上文圍繞了普通檔案I/O進行了討論——開啟檔案、讀檔案或寫檔案。本文將描述檔案系統的其他特徵和檔案的性質。將從stat函式開始,stat結構中的大多數成員都是基本系統資料型別,逐個分解stat結構的每一個成員以瞭解檔案的所有屬性。 使用stat函式最多的地方可能就是[ls -l

Linux系統下python學習筆記——Linux中檔案目錄常用命令詳解

一、檢視目錄內容 ls命令說明: 英文單詞list的簡寫,功能為列出目錄的內容,是使用者最常用的命令字義    Linux下檔案和目錄的特點: Linux檔案或目錄名稱最長可以有256個字元 以 . 開頭的檔案為隱藏檔案,需要用-a引數才能顯示(all

檔案目錄操作相關的函式

獲取檔案資訊: #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> // 成功返回0,出錯返回-1 int stat(const char *path, struct stat *b

Python OS模組之操作檔案目錄

#-*-coding:utf-8-*- import os import shutil ###############OS模組############## #獲得當前python指令碼的工作目錄 os.getcwd() #獲得指定目錄下的所有檔案和目錄名 os.listdir("C:\\")

Linux檔案目錄許可權的計算方法

Linux檔案和目錄許可權的計算方法 第一步:將預設許可權(目錄777,檔案666)和umask值都轉換為二進位制; 第二步:對umask值取反; 第三步:將預設許可權和umask取反的值做與運算; 第四步:將得到的二進位制轉換為八進位制,即為許可權。 例如:當umask

Linux學習第三天--操作檔案目錄

此時此刻,我們已經準備好了做些真正的工作!這一章節將會介紹以下命令: cp -複製檔案和目錄 mv -移動/重新命名檔案和目錄 mkdir -建立目錄 rm -刪除檔案和目錄 ln -建立硬連結和符號連結 這五個命令屬於最長使用的Linux命