zip

原创 2015年11月21日 12:23:34

写个zip工具玩玩。


// ZlibTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include "zip.h"
#include "zlib.h"
#include "unzip.h"
#include "windows.h"
#include "iostream"

using namespace std;

#define  MAX_SIZE 1024

int decompress()
{
	string zip = "F:/project/cpp/ZlibTest/ZlibTest/test.zip";
	int folderpos = zip.find_last_of("/");
	int dotPos = zip.find_last_of(".");

	string rootPath = zip.substr(0,folderpos+1);
	string zipFileName = zip.substr(folderpos+1,dotPos-folderpos-1);
	unzFile zipFile = unzOpen(zip.c_str());
	if (!zipFile)
	{
		cout<<"没有找到"<<zip.c_str()<<"文件"<<endl;
		return 0;
	}
	unz_global_info globalInfo;
	if(unzGetGlobalInfo(zipFile,&globalInfo)!=UNZ_OK){
		cout<<"没有获取到zip文件的信息"<<endl;
		unzClose(zipFile);
		return 0;
	}
	rootPath.append(zipFileName).append("/");
	::CreateDirectoryA(rootPath.c_str(),NULL);

	for(int i = 0;i<globalInfo.number_entry;i++){
		unz_file_info  fileInfo;
		char fileName[MAX_SIZE];
		if(unzGetCurrentFileInfo(zipFile,&fileInfo,fileName,MAX_SIZE,NULL,0,NULL,0)!=UNZ_OK){
			cout<<"获取文件"<<i<<"失败"<<endl;
			unzClose(zipFile);
			return 0;
		}
		string temp = rootPath;
		string fullPath = temp.append(fileName);

		int filenameLength = strlen(fileName);
		if(fileName[filenameLength-1] == '/'){
			::CreateDirectoryA(fullPath.c_str(),NULL);
		}else{

			cout<<"文件"<<i<<":		"<<fullPath.c_str()<<endl;
			if (unzOpenCurrentFile(zipFile)!=UNZ_OK)
			{
				cout<<"打开文件失败"<<endl;
				unzClose(zipFile);
				return 0;
			}
			FILE* out;
			fopen_s(&out,fullPath.c_str(),"wb");
			if (!out)
			{
				cout<<"打开文件失败"<<endl;
				unzCloseCurrentFile(zipFile);
				unzClose(zipFile);
				return 0;
			}
			char buff[MAX_SIZE]={0};
			int size =0;
			while ((size = unzReadCurrentFile(zipFile,buff,MAX_SIZE))!=0)
			{
				fwrite(buff,size,1,out);
			}
			
			fclose(out);
			unzCloseCurrentFile(zipFile);
		}

		if((i+1)<globalInfo.number_entry){
			if (unzGoToNextFile(zipFile)!= UNZ_OK)
			{
				cout<<"转到下一个文件失败"<<endl;
				unzClose(zipFile);
				return 0;
			}
		}
	}
	unzClose(zipFile);
	cout<<"end"<<endl;
	return 0;
}

void compress()
{
	string targetpath = "F:/project/cpp/ZlibTest/ZlibTest/compress.zip";
	string files[3]={"F:/project/cpp/ZlibTest/ZlibTest/compress/txt2.txt",
		"F:/project/cpp/ZlibTest/ZlibTest/compress/txt3.txt",
		"F:/project/cpp/ZlibTest/ZlibTest/compress/update/txt1.txt"};
	zipFile zip = zipOpen(targetpath.c_str(),APPEND_STATUS_CREATE);
	for (int i = 0;i<3;i++)
	{
		string curFile = files[i];
		string splitStr = "compress";
		int splitPos = curFile.find(splitStr);
		int nextPos = splitPos+splitStr.length()+1;
		string filename = curFile.substr(nextPos);

		zip_fileinfo zipFileInfo;
		int result = zipOpenNewFileInZip(zip,filename.c_str(),&zipFileInfo,NULL,0,NULL,0,NULL,0,0);
		if (result!=Z_OK)
		{
			cout<<"打开压缩文件:"<<curFile.c_str()<<"失败"<<endl;
			return;
		}
		char buff[MAX_SIZE]={0};
		
		FILE* file;
		fopen_s(&file,curFile.c_str(),"r");
		while (!feof(file))
		{
			int numBytes = fread_s(buff,MAX_SIZE,1,MAX_SIZE,file);
			zipWriteInFileInZip(zip,buff,numBytes);
		}
		cout<<"文件"<<curFile.c_str()<<"压缩成功"<<endl;
		fclose(file);
		zipCloseFileInZip(zip);
	}
	zipClose(zip,NULL);
}

int _tmain(int argc, _TCHAR* argv[])
{
	compress();
	decompress();
	system("pause");
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

Linux 压缩某个文件夹(文件夹打包)

tar -zcvf /home/xahot.tar.gz /xahot tar -zcvf 打包后生成的文件名全路径 要打包的目录 例子:把/xahot文件夹打包后生成一个/home/xahot....

Linux 下 zip 压缩/解压缩 命令的使用

常用 zip/unzip 命令整理

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

压缩和解压文件的工具类(ant-1.8.4.jar)

使用ant-1.8.4.jar中的org.apache.tools.zip包进行文件的文件压缩和解压,主要使用该jar包中的以下类: org.apache.tools.zip.ZipEntry; ...

python zip函数

zip函数接受任意多个(包括0个和1个)序列作为参数,返回一个tuple列表。具体意思不好用文字来表述,直接看示例: 1.示例1: x = [1, 2, 3] y = [4, 5, ...

使用org.apache.tools.zip实现zip压缩和解压

import java.io.*;  import org.apache.tools.zip.*;  import java.util.Enumeration;  /**  *功能:zip压缩...

vc解压和载入zip资源包方法

提示: 这种方法解压后会释放所有文件在你选择的路径下,但是有个缺点是不会删除解压的文件 需要在项目中添加XUnzip.cpp和XUnzip.h代码:(需要的朋友可留言) //载入zip资源包 B...

Java 解压缩 zip格式的压缩文件

可循环解压掉压缩文件中所有zip的文件 /** * 迭代解压ZIP文件,可将压缩包中包含的压缩文件组个解压 * @param zipPath 压缩文件路径 * @param unZ...

java压缩解压缩rar、zip文件

package com.test; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ja...

Java ZIP

声明:本文属于原创作品,转载请注明出处。 本文是关于Java语言对于压缩文件ZIP的一些操作,可以通过流对象ZipInputStream来操作,也可以通过文件对象ZipFile来操作。其中,...

Java-ZipUtil工具类

import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOExceptio...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)