文章目录

  • 1.压缩单一文件
  • 2.压缩文件目录
  • 3.操作压缩包中的文件
  • 4.给压缩包添加注释
  • 5.使用zip64压缩(单个文件超过4G的时候)
  • 6.解压压缩包中的某个文件
  • 7.解压缩包中目录下的某个文件
  • 8.解压缩包中的全部文件
  • 9.解压缩zip64文件
  • 10.校验压缩包中文件路径的合法性
  • 11.将压缩之后的某个文件解压出来
  • 12.获取压缩包的一些相关信息

Poco库提供了压缩zip包和解压缩zip包的模块,通过该模块我们可以很方便的操作zip文件。在使用zip文件的压缩和解压缩功能的时候,我们需要先引入对应的模块库PocoZip。引入之后我们就可以自由的使用zip功能了,这里介绍一下zip模块的常规方法。

1.压缩单一文件

void compressSingleFile()
{//指定输出zip文件Poco::FileOutputStream out("test.zip"); //添加需要压缩的文件Poco::Path theFile("testFile");Compress c(out, true);//添加测试文件c.addFile(theFile, theFile.getFileName());ZipArchive a(c.close());
}

2.压缩文件目录

void compressDirectory()
{//指定输出文件名Poco::FileOutputStream out("test.zip");//递归创建目录Poco::File aFile("some/");if (aFile.exists()) aFile.remove(true);Poco::File aDir("some/recursive/dir/");aDir.createDirectories();Poco::File aDir2("some/other/recursive/dir/");aDir2.createDirectories();Poco::File aF("some/recursive/dir/test.file");aF.createFile();//创建测试文件Poco::FileOutputStream fos(aF.path());fos << "just some test data";fos.close();//创建目录并递归添加Poco::Path theFile(aFile.path());theFile.makeDirectory();Compress c(out, true);c.addRecursive(theFile, ZipCommon::CL_MAXIMUM, false, theFile);ZipArchive a(c.close());Poco::File(aFile).remove(true);
}

3.操作压缩包中的文件

void addFileToZip()
{//创建测试的压缩文件Poco::FileOutputStream out("test.zip");Poco::Path theFile("test.file");Compress c(out, true);c.addFile(theFile, theFile.getFileName());ZipArchive a(c.close());//重命名压缩包中的文件ZipManipulator zm("test.zip", true);zm.renameFile("test.file", "renametest.file");//向压缩包中添加新文件zm.addFile("doc/othertest.zip", "test.zip"));ZipArchive archive=zm.commit();//查找压缩包中的文件assertTrue (archive.findHeader("doc/test.zipp") != archive.headerEnd());//删除压缩包中的文件zm.deleteFile("test.zip");//替换压缩包中的文件zm.replaceFile("test.zip", "doc.zip");
}

4.给压缩包添加注释

void SetZipComment()
{std::string comment("Test Comment");Poco::FileOutputStream out("comment.zip");Poco::Path theFile("test.file");Compress c(out, true);c.addFile(theFile, theFile.getFileName());//添加注释c.setZipComment(comment);ZipArchive a(c.close());assertTrue (a.getZipComment() == comment);
}

5.使用zip64压缩(单个文件超过4G的时候)

参考的官方的例子

void createDataFile(const std::string& path, Poco::UInt64 size)
{Poco::FileOutputStream out(path.c_str(), std::ios::trunc);assertTrue ( ! out.fail() );Poco::Buffer<char> buffer(MB);for(int i = 0; size != 0; i++) {std::memset(buffer.begin(), i, buffer.size());Poco::UInt64 bytesToWrite = std::min(size, static_cast<Poco::UInt64>(buffer.size()));out.write(buffer.begin(), bytesToWrite);assertTrue ( ! out.fail() );size -= bytesToWrite;}out.flush();assertTrue ( ! out.fail() );out.close();assertTrue ( ! out.fail() );
}void createZip64()
{using FileMap = std::map<std::string, Poco::UInt64>;std::cout << std::endl;FileMap files;files["data1.bin"] = static_cast<Poco::UInt64>(KB)*4096+1;files["data2.bin"] = static_cast<Poco::UInt64>(KB)*16;files["data3.bin"] = static_cast<Poco::UInt64>(KB)*4096-1;for(FileMap::const_iterator it = files.begin(); it != files.end(); it++){std::cout << '\t' << "createDataFile(" << it->first << ", " << it->second << ");" << std::endl;createDataFile(it->first, it->second);}Poco::FileOutputStream out(Poco::Path::temp() + "zip64.zip", std::ios::trunc);Compress c(out, true, true);for(FileMap::const_iterator it = files.begin(); it != files.end(); it++){const std::string& path = it->first;std::cout << '\t' << "addFile(" << path <<  ");" << std::endl;c.addFile(path, path, ZipCommon::CM_STORE);}ZipArchive a(c.close());for(FileMap::const_iterator it = files.begin(); it != files.end(); it++){const std::string& path = it->first;Poco::UInt64 size = it->second;ZipArchive::FileHeaders::const_iterator it2 = a.findHeader(path);assertTrue (it2 != a.headerEnd());const Poco::Zip::ZipLocalFileHeader& file = it2->second;assertTrue (file.getUncompressedSize() == size);assertTrue (file.getCompressedSize() == size);}for (FileMap::const_iterator it = files.begin(); it != files.end(); it++){Poco::File(it->first).remove();}
}

6.解压压缩包中的某个文件

void decompressSingleFile()
{std::string testFile = "test.zip";Poco::FileInputStream inp(testFile);ZipArchive arch(inp);ZipArchive::FileHeaders::const_iterator it = arch.findHeader("testfile.txt");assertTrue (it != arch.headerEnd());ZipInputStream zipin (inp, it->second);std::ostringstream out(std::ios::binary);Poco::StreamCopier::copyStream(zipin, out);
}

7.解压缩包中目录下的某个文件

void decompressSingleFileInDir()
{std::string testFile = "test.zip";Poco::FileInputStream inp(testFile);ZipArchive arch(inp);ZipArchive::FileHeaders::const_iterator it = arch.findHeader("testdir/testfile.txt");assertTrue (it != arch.headerEnd());ZipInputStream zipin (inp, it->second);std::ostringstream out(std::ios::binary);Poco::StreamCopier::copyStream(zipin, out);assertTrue (!out.str().empty());
}

8.解压缩包中的全部文件

void UseZip::onDecompressError(const void* pSender, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string>& info)
{++_errCnt;
}
void UseZip::decompress()
{//指定压缩文件和输出目录std::string testFile = "test.zip";Poco::FileInputStream inp(testFile);assertTrue (inp.good());//@1压缩文件输入流//@2输出目录//@3输出模式false的时候递归创建文件目录//true的时候把所有文件输出到一个目录中Decompress dec(inp, Poco::Path::temp(),false);//指定错误的回调函数dec.EError += Poco::Delegate<UseZip, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string>>(this, &UseZip::onDecompressError);//解压缩文件dec.decompressAllFiles();dec.EError -= Poco::Delegate<UseZip, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string>>(this, &UseZip::onDecompressError);assertTrue (_errCnt == 0);assertTrue (!dec.mapping().empty());
}

9.解压缩zip64文件

void verifyDataFile(const std::string& path, Poco::UInt64 size)
{Poco::FileInputStream in(path);assertTrue ( ! in.fail() );Poco::Buffer<char> buffer1(MB);Poco::Buffer<char> buffer2(MB);for (int i = 0; size != 0; i++){std::memset(buffer1.begin(), i, buffer1.size());std::memset(buffer2.begin(), 0, buffer2.size());Poco::UInt64 bytesToRead = std::min(size, static_cast<Poco::UInt64>(buffer2.size()));in.read(buffer2.begin(), bytesToRead);assertTrue (!in.fail() );assertTrue (std::memcmp(buffer1.begin(), buffer2.begin(), static_cast<std::size_t>(bytesToRead)) == 0);size -= bytesToRead;}char c;in.read(&c, 1);assertTrue ( in.eof() );
}void decompressZip64()
{std::map<std::string, Poco::UInt64> files;files[Poco::Path::temp() + "data1.bin"] = static_cast<Poco::UInt64>(KB)*4096+1;files[Poco::Path::temp() + "data2.bin"] = static_cast<Poco::UInt64>(KB)*16;files[Poco::Path::temp() + "data3.bin"] = static_cast<Poco::UInt64>(KB)*4096-1;for(std::map<std::string, Poco::UInt64>::const_iterator it = files.begin(); it != files.end(); it++){Poco::File file(it->first);if(file.exists())file.remove();}Poco::FileInputStream in(Poco::Path::temp() + "zip64.zip");Decompress c(in, Poco::Path::temp());c.decompressAllFiles();for(std::map<std::string, Poco::UInt64>::const_iterator it = files.begin(); it != files.end(); it++){verifyDataFile(it->first, it->second);}
}

10.校验压缩包中文件路径的合法性

ZipCommon::isValidPath(".");
ZipCommon::isValidPath("some/dir/or/another");

11.将压缩之后的某个文件解压出来

void CrcAndSizeAfterDataWithArchive()
{std::string testFile = "data.zip";Poco::FileInputStream inp(testFile);assertTrue (inp.good());Poco::Zip::ZipArchive zip(inp);inp.clear();inp.seekg(0);Poco::Zip::ZipArchive::FileHeaders::const_iterator it = zip.headerBegin();for ( ; it!=zip.headerEnd(); ++it){Poco::Zip::ZipInputStream zipis(inp,it->second);Poco::Path path(it->second.getFileName());if (path.isFile()){Poco::FileOutputStream os(Poco::Path::temp() + "test.dat");Poco::StreamCopier::copyStream(zipis,os);}}
}

12.获取压缩包的一些相关信息

void GetZipFileInfo()
{std::string testFile = "test.zip";Poco::FileInputStream inp(testFile);assertTrue (inp.good());//跳过某个文件SkipCallback skip;ZipLocalFileHeader hdr(inp, false, skip);assertTrue (ZipCommon::HS_FAT == hdr.getHostSystem());//获取版本号int major = hdr.getMajorVersionNumber();int POCO_UNUSED minor = hdr.getMinorVersionNumber();assertTrue (major <= 2);std::size_t hdrSize = hdr.getHeaderSize();assertTrue (hdrSize > 30);ZipCommon::CompressionMethod POCO_UNUSED cm = hdr.getCompressionMethod();assertTrue (!hdr.isEncrypted());Poco::DateTime aDate = hdr.lastModifiedAt();Poco::UInt64 POCO_UNUSED cS = hdr.getCompressedSize();Poco::UInt64 POCO_UNUSED uS = hdr.getUncompressedSize();const std::string& POCO_UNUSED fileName = hdr.getFileName();
}

Poco库使用:文件压缩和解压缩相关推荐

  1. Qt中用QuaZip来压缩和解压缩文件

    1.简介 QuaZIP是使用Qt,C++对ZLIB进行简单封装的用于压缩ZIP以及解压缩ZIP的开源库.如果你的Qt项目当中用到了压缩以及解压缩ZIP的话你可以考虑选择使用它. 官方主页:http:/ ...

  2. IOS开发之网络编程--文件压缩和解压缩

    2019独角兽企业重金招聘Python工程师标准>>> 前言: QQ表情包就用到了解压缩,从网络下载的那么多表情文件格式并不是一个一个图片文件,而是多个图片压缩而成的表情压缩包.下面 ...

  3. Unity3D压缩和解压缩文件

    今天试了试,在Unity不能用C# IO类里的压缩和解压缩,看了论坛里的一些讨论,就想着能不能用第三方的压缩和解压缩动态库. 于是乎就下了一个Ionic.Zip.dll.然后,然后就没有然后了. Co ...

  4. PHP压缩和解压缩文件的三种方式

    前言:平时在项目中,偶尔会遇到文件备份导入导出的需求,在此记录使用PHP执行文件压缩和解压缩的三种方式** 目录 1. 使用PHP扩展的ZipArchive类 2. 使用压缩与解压缩类PclZip.p ...

  5. iOS中使用ZipArchive 压缩和解压缩文件

    引自 http://www.36duo.com/thread-119-1-1.html 在本教程中,我将演示如何在iOS程序中压缩和解压缩文件.我们将使用一个叫做ZipArchive的第三方库来实现. ...

  6. php zlib 解压缩,使用php的zlib压缩和解压缩swf文件

    我在以前写过怎么使用c#来压缩和解压缩swf文件,解压缩,压缩和读取flash头文件信息需要使用一个开源的链接库,而且使用起来也不是很方便,但是使用php就不一样了,php包含了zlib的链接库,可以 ...

  7. asp在线压缩和解压缩文件(文件夹)

    asp在线压缩和解压缩文件(文件夹) <% '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ '\\ '\\ 1. c:\ ...

  8. java 解压与压缩代码_Java实现多文件压缩和解压缩代码详解

    Java实现多文件压缩和解压缩代码 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStre ...

  9. linux下文件的压缩和解压缩

    linux下文件的压缩和解压缩 目录 1.压缩 2.解压缩 3.归档工具 一. 压缩 compress: -d:解压缩,相当于uncompres-c:结果输出至标准输出,不删除原文件-v:显示详情 - ...

  10. 在C#中利用SharpZipLib进行文件的压缩和解压缩

    我在做项目的时候需要将文件进行压缩和解压缩,于是就从http://www.icsharpcode.net下载了关于压缩和解压缩的源码,但是下载下来后,面对这么多的代码,一时不知如何下手.只好耐下心来, ...

最新文章

  1. CMD是什么?(命令行提示符)如何使用python在windows上操作CMD?(python执行命令行)os.syste[m](执行的命令)、os.popen(执行的命令)
  2. Java | Assignment Statements Expressions
  3. java泛型——桥方法
  4. 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  5. Web Audio API
  6. Windows10配置maven环境变量(图文教程)
  7. 工作分析文献综述_学术知识| 如何撰写文献综述
  8. 2019中国基金业金融科技发展白皮书
  9. 产品经理书籍_rate
  10. UOS桌面操作系统专业版字体
  11. MacBookPro安装JDK环境
  12. 计算机视觉教程0-3:为何拍照会有死亡视角?详解相机矩阵与畸变
  13. 目前比较流行的网站开发框架有哪些?
  14. java应用 cpu占用过高问题分析及解决方法
  15. 【具体实现过程】百度地图POI区域的边界经纬度坐标数据采集
  16. C#使用德卡T10读取社报告卡基本信息
  17. 一步一步实现一个Web Server-03
  18. CTF题记——计划第一周
  19. 【C语言】 从零开始的学习历程(一)
  20. 利用chrome浏览器的F12功能提取网页中的视频、音乐

热门文章

  1. 【5G核心网】5GC核心网之网元NSSF
  2. 通过搜狗蜘蛛池,让网站收录排名提升
  3. 用你的微笑魔力征服下属
  4. Leaflet地图 - 绘制台风风圈 - 2
  5. python unpack java,Java中的python struct.unpack - java
  6. Java小明过桥问题,过桥问题--经典智力题
  7. 新版Chrome设置--disable-web-security无效 解决方法
  8. 地球物理及空间物理相关数据下载
  9. 《可复制的领导力》脑图
  10. 以太网帧机构 ,mtu ,分包原理 tcp的三次握手,四次挥手