中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

minizip c++ 壓縮文件及文件夾

發布時間:2020-03-31 12:40:37 來源:網絡 閱讀:6601 作者:hakuyo 欄目:編程語言
#include <fcntl.h>
#include <sys/stat.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <stdlib.h>

#include <vector>
#include <string>
#include <iostream>
#include <fstream>

#include "minizip/zip.h"
#include "minizip/unzip.h"

using namespace std;

void EnumDirFiles(const string& dirPrefix,const string& dirName,vector<string>& vFiles)
{
    if (dirPrefix.empty() || dirName.empty())
        return;
    string dirNameTmp = dirName;
    string dirPre = dirPrefix;
    
    if (dirNameTmp.find_last_of("/") != dirNameTmp.length() - 1)
        dirNameTmp += "/";
    if (dirNameTmp[0] == '/')
        dirNameTmp = dirNameTmp.substr(1);
    if (dirPre.find_last_of("/") != dirPre.length() - 1)
        dirPre += "/";
    
    string path;

    path = dirPre + dirNameTmp;


    struct stat fileStat;
    DIR* pDir = opendir(path.c_str());
    if (!pDir) return;

    struct dirent* pDirEnt = NULL;
    while ( (pDirEnt = readdir(pDir)) != NULL )
    {
        if (strcmp(pDirEnt->d_name,".") == 0 || strcmp(pDirEnt->d_name,"..") == 0)
            continue;

        string tmpDir = dirPre + dirNameTmp + pDirEnt->d_name;
        if (stat(tmpDir.c_str(),&fileStat) != 0)
            continue;

        string innerDir = dirNameTmp + pDirEnt->d_name;
        if (fileStat.st_mode & S_IFDIR == S_IFDIR)
        {
            EnumDirFiles(dirPrefix,innerDir,vFiles);
            continue;
        }

        vFiles.push_back(innerDir);
    }

    if (pDir)
        closedir(pDir);
}

int writeInZipFile(zipFile zFile,const string& file)
{
    fstream f(file.c_str(),std::ios::binary | std::ios::in);
    f.seekg(0, std::ios::end);
    long size = f.tellg();
    f.seekg(0, std::ios::beg);
    if ( size <= 0 )
    {
        return zipWriteInFileInZip(zFile,NULL,0);
    }
    char* buf = new char[size];
    f.read(buf,size);
    int ret = zipWriteInFileInZip(zFile,buf,size);
    delete[] buf;
    return ret;
}

int main(int argc, char *argv[])
{
    if (argc < 3)
    {
        cout<<"usage: mini from to"<<endl;
        return -1;
    }
    string dest = string(argv[1]);
    string src = string(argv[2]);
    if (src.find_last_of("/") == src.length() - 1)
        src = src.substr(0,src.length()-1);

    struct stat fileInfo;
    stat(src.c_str(), &fileInfo);
    if (S_ISREG(fileInfo.st_mode))
    {
        zipFile zFile = zipOpen(dest.c_str(),APPEND_STATUS_CREATE);
        if (zFile == NULL)
        {
            cout<<"openfile failed"<<endl;
            return -1;
        }
        zip_fileinfo zFileInfo = { 0 };
        int ret = zipOpenNewFileInZip(zFile,src.c_str(),&zFileInfo,NULL,0,NULL,0,NULL,0,Z_DEFAULT_COMPRESSION);
        if (ret != ZIP_OK)
        {
            cout<<"openfile in zip failed"<<endl;
            zipClose(zFile,NULL);
            return -1;
        }
        ret = writeInZipFile(zFile,src);
        if (ret != ZIP_OK)
        {
            cout<<"write in zip failed"<<endl;
            zipClose(zFile,NULL);
            return -1;
        }
        zipClose(zFile,NULL);
        cout<<"zip ok"<<endl;
    }
    else if (S_ISDIR(fileInfo.st_mode))
    {
        size_t pos = src.find_last_of("/");
        string dirName = src.substr(pos + 1);
        string dirPrefix = src.substr(0,pos);

        zipFile zFile = zipOpen(dest.c_str(),APPEND_STATUS_CREATE);
        if (zFile == NULL)
        {
            cout<<"openfile failed"<<endl;
            return -1;
        }

        vector<string> vFiles;
        EnumDirFiles(dirPrefix,dirName,vFiles);
        vector<string>::iterator itF = vFiles.begin();
        for(;itF != vFiles.end(); ++itF)
        {
            zip_fileinfo zFileInfo = { 0 };
            int ret = zipOpenNewFileInZip(zFile,itF->c_str(),&zFileInfo,NULL,0,NULL,0,NULL,0,Z_DEFAULT_COMPRESSION);
            if (ret != ZIP_OK)
            {
                cout<<"openfile in zip failed"<<endl;
                zipClose(zFile,NULL);
                return -1;
            }
            ret = writeInZipFile(zFile,*itF);
            if (ret != ZIP_OK)
            {
                cout<<"write in zip failed"<<endl;
                zipClose(zFile,NULL);
                return -1;
            }
        }

        zipClose(zFile,NULL);
        cout<<"zip ok"<<endl;
    }
    return 0;
}
target=mini

lib=-lminizip -laes -lz 
libpath=-L/usr/local/lib
incpath=-I/usr/local/include
${target}:
    g++ main.cpp -g -o $@ ${lib} ${libpath} ${incpath}

clean:
    -rm ${target}


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

万安县| 监利县| 临澧县| 金华市| 蓬安县| 利川市| 濮阳县| 广饶县| 太仆寺旗| 林甸县| 塘沽区| 于田县| 乐业县| 天门市| 吴桥县| 政和县| 故城县| 樟树市| 施甸县| 澜沧| 瑞金市| 康定县| 阳原县| 天台县| 海阳市| 仁怀市| 中江县| 措美县| 巴楚县| 大竹县| 北碚区| 通许县| 芦溪县| 巴林左旗| 邢台市| 曲麻莱县| 富宁县| 龙南县| 临汾市| 堆龙德庆县| 如东县|