如何使用Poco :: ZIP压缩/解压缩zip文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Poco :: ZIP压缩/解压缩zip文件相关的知识,希望对你有一定的参考价值。

我是C ++的新手,尤其是在压缩/解压缩中。我当前的项目正在使用Poco库,并且Zip扩展名用于将文件/目录压缩或解压缩为Zip文件。

#include <Poco/FileStream.h>
#include <Poco/Zip/Decompress.h>
#include <Poco/Zip/Compress.h>
#include <Poco/Timestamp.h>
#include <Poco/File.h>
voidZipFile(string source, string target, List extensions, bool append, bool overWrite)
{
    Poco::DateTime(Timestamp);
    set <string> extensionsSet;
    std::ofstream fos(target, ios::binary);
    Poco::Zip::Compress c(fos, true);

    for (int i = 0; i < extensions.Size(); i++) {
        string ext = std::dynamic_pointer_cast<String>(extensions.operator[](i))->GetPrimitive();
        extensionsSet.insert(ext);
    }
    c.setStoreExtensions(extensionsSet);//set extensions List 

    Poco::File aFile(source);//This is where I start my compress action

    if (aFile.exists())
    {
        Poco::Path p(aFile.path());
        if (aFile.isDirectory())
        {
            if (p.isDirectory()) {
                c.addDirectory(p, Poco::DateTime());
            }
            else {

            }
        }
        else if (aFile.isFile())
        {
            c.addFile(p, p.getFileName());
        }
    }
    else {
        _log.EndMethod();
        throw new FileNotFoundException("File Not Found");
    }


    //Poco::FileOutputStream fos(target, std::ios::binary);

    c.close(); // MUST be done to finalize the Zip file
    fos.close();


}

以上代码是我到目前为止所拥有的,我可以将单个文件压缩为.zip文件。

如何将文件夹/目录压缩为.zip文件?我不能使用其他库,因为Poco也用于当前项目的其他部分。

答案

您需要添加一种递归方式来搜索文件夹。

这是我的想法:

Poco::File aFile(entry);
        if (!aFile.isDirectory())
            throw ZipException("Not a directory: "+ entry.toString());
        Poco::Path aName(name);
        aName.makeDirectory();
        if (!excludeRoot)
        {
            if (aName.depth() == 0)
            {
                Poco::Path tmp(entry);
                tmp.makeAbsolute(); // eliminate ../
                aName = Poco::Path(tmp[tmp.depth()-1]);
                aName.makeDirectory();
            }

            addDirectory(aName, aFile.getLastModified());
        }
    // iterate over children in the directory
        std::vector<std::string> children;
        aFile.list(children);
        std::vector<std::string>::const_iterator it = children.begin();
        std::vector<std::string>::const_iterator itEnd = children.end();
        for (; it != itEnd; ++it)
        {
            Poco::Path realFile(entry, *it);
            Poco::Path renamedFile(aName, *it);
            Poco::File aFile(realFile);
            if (aFile.isDirectory())
            {
                realFile.makeDirectory();
                renamedFile.makeDirectory();
                addRecursive(realFile, cm, cl, false, renamedFile);
            }
            else
            {
                realFile.makeFile();
                renamedFile.makeFile();
                addFile(realFile, renamedFile, cm, cl);
            }
        }

以上是关于如何使用Poco :: ZIP压缩/解压缩zip文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中解压缩多层 zip 文件

linux文将于目录的压缩和解压缩命令:gzip压缩文件

PclZip library能够压缩与解压缩Zip格式

如何从 zip 文件中读取数据而无需解压缩整个文件

如何在 Windows 8 中使用密码解压缩 zip [关闭]

如何使用 Objective-C 解压缩/解压缩,包括单个文件检索