czlib解压文件夹
‘壹’ C++怎么实现解压RAR或者ZIP文件
用Zlib库,下载地址: http://download.chinaunix.net/download/0013000/12241.shtml
BOOL ZipCompress(LPCTSTR lpszSourceFiles, LPCTSTR lpszDestFile);
BOOL ZipExtract(LPCTSTR lpszSourceFile, LPCTSTR lpszDestFolder); 要引入的源文件 ZLib 主目录下的代码,除 minigzip.c、example.c 外; contrib\minizip 下的代码,除 minizip.c、miniunz.c 外。压缩相关: zipOpen64 zipClose zipOpenNewFileInZip zipCloseFileInZip zipWriteInFileInZip解压相关: unzOpen64 unzClose unzGetGlobalInfo64 unzGoToNextFile unzGetCurrentFileInfo64 unzOpenCurrentFile unzCloseCurrentFile unzReadCurrentFile
‘贰’ 如何知道zlib解压缩
用zlib能干什么
先来看看 zlib 都提供了那些函数, 都在zlib.h中,看到一堆宏不要晕,其实都是为了兼容各种编译器和一些类型定义.死死抓住那些主要的函数的原型声明就不会受到这些东西的影响了.
关键的函数有那么几个:
(1)int compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
把源缓冲压缩成目的缓冲, 就那么简单, 一个函数搞定
(2) int compress2 (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen,int level);
功能和上一个函数一样,都一个参数可以指定压缩质量和压缩数度之间的关系(0-9)不敢肯定这个参数的话不用太在意它,明白一个道理就好了: 要想得到高的压缩比就要多花时间
(3) uLong compressBound (uLong sourceLen);
计算需要的缓冲区长度. 假设你在压缩之前就想知道你的产度为 sourcelen 的数据压缩后有多大, 可调用这个函数计算一下,这个函数并不能得到精确的结果,但是它可以保证实际输出长度肯定小于它计算出来的长度
(4) int uncompress (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen);
解压缩(看名字就知道了:)
(5) deflateInit() + deflate() + deflateEnd()
3个函数结合使用完成压缩功能,具体用法看 example.c 的 test_deflate()函数. 其实 compress() 函数内部就是用这3个函数实现的(工程 zlib 的 compress.c 文件)
(6) inflateInit() + inflate() + inflateEnd()
和(5)类似,完成解压缩功能.
(7) gz开头的函数. 用来操作*.gz的文件,和文件stdio调用方式类似. 想知道怎么用的话看example.c 的 test_gzio() 函数,很easy.
(8) 其他诸如获得版本等函数就不说了.
总结: 其实只要有了compress() 和uncompress() 两个函数,在大多数应用中就足够了.
‘叁’ zlib.dll 文件是什么应该放在哪个文件夹
zlib.dll是ZLIB压缩库相关文件,用于Windows应用程序压缩和解压缩。
属于: ZLIB
系统 DLL文件: 否
常见错误: File Not Found, Missing File, Exception Errors
‘肆’ 用C语言简单演示如何借助zlib库实现文件的压缩和解压缩
问题的根源在于这些网友对于字符串和字节流的概念非常的模糊,对文本文件和二进制文件的区别常常模棱两可,其实字节流可以表示所有的数据,二进制文件才是任何文件的本质。字节流是一个字节接一个字节,并没有结束符号,所以需要给它一个长度信息。二进制文件是一个字节接一个字节,并没有换行符之类的。文件压缩的时候,可以通过源文件的长度自动计算缓冲区的长度,压缩后写入目标文件之前,需先保留源文件和目标数据的长度作为解压缩的依据,参考如下代码:#include #include #include int main(int argc, char* argv[]) { FILE* file; uLong flen; unsigned char* fbuf = NULL; uLong clen; unsigned char* cbuf = NULL; /* 通过命令行参数将srcfile文件的数据压缩后存放到dstfile文件中 */ if(argc < 3) { printf("Usage: zcdemo srcfile dstfile\n"); return -1; } if((file = fopen(argv[1], "rb")) == NULL) { printf("Can\'t open %s!\n", argv[1]); return -1; } /* 装载源文件数据到缓冲区 */ fseek(file, 0L, SEEK_END); /* 跳到文件末尾 */ flen = ftell(file); /* 获取文件长度 */ fseek(file, 0L, SEEK_SET); if((fbuf = (unsigned char*)malloc(sizeof(unsigned char) * flen)) == NULL) { printf("No enough memory!\n"); fclose(file); return -1; } fread(fbuf, sizeof(unsigned char), flen, file); /* 压缩数据 */ clen = compressBound(flen); if((cbuf = (unsigned char*)malloc(sizeof(unsigned char) * clen)) == NULL) { printf("No enough memory!\n"); fclose(file); return -1; } if(compress(cbuf, &clen, fbuf, flen) != Z_OK) { printf("Compress %s failed!\n", argv[1]); return -1; } fclose(file); if((file = fopen(argv[2], "wb")) == NULL) { printf("Can\'t create %s!\n", argv[2]); return -1; } /* 保存压缩后的数据到目标文件 */ fwrite(&flen, sizeof(uLong), 1, file); /* 写入源文件长度 */ fwrite(&clen, sizeof(uLong), 1, file); /* 写入目标数据长度 */ fwrite(cbuf, sizeof(unsigned char), clen, file); fclose(file); free(fbuf); free(cbuf); return 0; }文件解压缩的时候,可以通过保留信息得到缓冲区和数据流的大小,这样解压缩后直接保存即可,参考如下代码:#include #include #include int main(int argc, char* argv[]) { FILE* file; uLong flen; unsigned char* fbuf = NULL; uLong ulen; unsigned char* ubuf = NULL; /* 通过命令行参数将srcfile文件的数据解压缩后存放到dstfile文件中 */ if(argc < 3) { printf("Usage: zudemo srcfile dstfile\n"); return -1; } if((file = fopen(argv[1], "rb")) == NULL) { printf("Can\'t open %s!\n", argv[1]); return -1; } /* 装载源文件数据到缓冲区 */ fread(&ulen, sizeof(uLong), 1, file); /* 获取缓冲区大小 */ fread(&flen, sizeof(uLong), 1, file); /* 获取数据流大小 */ if((fbuf = (unsigned char*)malloc(sizeof(unsigned char) * flen)) == NULL) { printf("No enough memory!\n"); fclose(file); return -1; } fread(fbuf, sizeof(unsigned char), flen, file); /* 解压缩数据 */ if((ubuf = (unsigned char*)malloc(sizeof(unsigned char) * ulen)) == NULL) { printf("No enough memory!\n"); fclose(file); return -1; } if(uncompress(ubuf, &ulen, fbuf, flen) != Z_OK) { printf("Uncompress %s failed!\n", argv[1]); return -1; } fclose(file); if((file = fopen(argv[2], "wb")) == NULL) { printf("Can\'t create %s!\n", argv[2]); return -1; } /* 保存解压缩后的数据到目标文件 */ fwrite(ubuf, sizeof(unsigned char), ulen, file); fclose(file); free(fbuf); free(ubuf); return 0; }
‘伍’ 如何在linux平台下使用C++语言实现多文件的压缩解压缩(使用zlib依赖库)必重谢!
由于Unix系一贯坚持功能分离,所以通常是先tar再gzip来完成多文件一次压缩。
开发中一般是借助zlib-X.X.X.tar.gzzlib-X.X.X.tarzlib-X.X.Xcontribminizip实例中的接口:
ZLib可能并不是一个针对ZIP文件的库,它只是一个针对gzip以及deflate算法的库。它提供了一个叫做minizip
(contribminizip)例子来给出操作ZIP文件的方法。下文将从ZLib出发,归结出两个傻瓜接口:BOOLZipCompress(LPCTSTRlpszSourceFiles,LPCTSTRlpszDestFile);
BOOLZipExtract(LPCTSTRlpszSourceFile,LPCTSTRlpszDestFolder);
要引入的源文件
ZLib主目录下的代码,除minigzip.c、example.c外;
contribminizip下的代码,除minizip.c、miniunz.c外。
相关API
虽
然minizip更像是个例子,但是除去其主程序minizip.c和miniunz.c后,剩下的部分我们可以看作是ZLib
的一个上层库,它封装了与ZIP文件格式相关的操作。而minizip.c和miniunz.c
就是我们要改写的——把它从命令行程序改为上述傻瓜接口。minizip.c和miniunz.c中用到的API主要有:
压缩相关:
zipOpen64
zipClose
zipOpenNewFileInZip
zipCloseFileInZip
zipWriteInFileInZip
解压相关:
unzOpen64
unzClose
unzGetGlobalInfo64
unzGoToNextFile
unzGetCurrentFileInfo64
unzOpenCurrentFile
unzCloseCurrentFile
unzReadCurrentFile
想必看到这些名字都能猜到怎么用了吧。好的接口果然能带给人愉悦的。minizip中的这些函数有的是带“64”的有的是不带的,有的还有“2”、“3”、“4”版本。这里一律用带64的,不带“2”、“3”、“4”的。
来源参考:http://www.cppblog.com/Streamlet/archive/2010/09/22/127368.html
‘陆’ zlib下载文件在哪
第一步 下载并解压zlib压缩包
打开zlib官网,找到下载链接,右键复制地址:
在Linux中使用wget命令下载,执行如下命令开始下载:
wget http://zlib.net/zlib-1.2.8.tar.gz
解压:
tar zxvf zlib-1.2.8.tar.gz
第二步 开始安装
安装过程比较简单,进入zlib的解压目录,依次执行下面几条命令即可:
配置:
./configure
如果之前没有安装gcc(C 编译器),这一步将报如下错误信息::
xueliang@dev:~/download/zlib-1.2.8$ ./configure
Checking for gcc…
Compiler error reporting is too harsh for ./configure (perhaps remove -Werror).
** ./configure aborting.
xueliang@dev:~/download/zlib-1.2.8$
希望我的回答能对你有所帮助。
‘柒’ 如何用C语言解压缩文件
如果你自己设计算法,就另当别论,如果想利用第3方的算法,我推荐用zlib,生成的压缩包是流行的zip格式.源代码很好找(www.zlib.net)
‘捌’ C++中如何调用zlib.dll进行解压和压缩
1
准备工作。
下载zlib.dll。以及相关头文件。将dll文件及头文件加入工程。
2
压缩:
调用函数compress.
形式为
int
compress(Byte
*
dest,
uLong*
destLen,
const
Byte
*source,
ULONG
sourceLen);
功能是将source指向的空间,长度为sourceLen的数据进行压缩,压缩数据储存在dest中,长度由参数destLen返回。
如果压缩出错,返回对应错误号,否则返回0.
3解压缩:
调用函数uncompress.
形式为
int
uncompress(Byte
*
dest,
uLong*
destLen,
const
Byte
*source,
ULONG
sourceLen);
功能是将source指向的空间,长度为sourceLen的数据进行解压缩,解压缩后的数据储存在dest中,长度由参数destLen返回。
如果解压缩出错,返回对应错误号,否则返回0.
‘玖’ 如何用VC++来调用zlib库压缩文件夹
就是用findfirst, findnext找到所有目录下的文件,逐个压缩就是了。我把这两步分开来写的。
现在的输出格式是:
文件名长,文件名,压缩后的长度,压缩的内容。
仅是示例而已,根据自己的需要修改吧。
#include <stdio.h>
#include <tchar.h>
#include "zlib.h"
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <windows.h>
#include <io.h>
using namespace std;
void recursiveGetFileNames( vector<string>& names, const char* path )
{
char savepath[ MAX_PATH ];
GetCurrentDirectory( sizeof( savepath ), savepath );
SetCurrentDirectory( path );
char fullpath[ MAX_PATH ];
GetCurrentDirectory( sizeof( fullpath ), fullpath );
_finddata_t fileinfo;
long handle = _findfirst( "*.*", &fileinfo );
if (handle == -1L)
return;
do
{
if ( fileinfo.attrib & _A_SUBDIR )
{
if ( strcmp( fileinfo.name, "." )
&& strcmp( fileinfo.name, ".." ) )
{
recursiveGetFileNames( names, fileinfo.name );
}
}
else
{
string str( fullpath );
str += "\\";
str += fileinfo.name;
names.push_back( str );
}
} while (::_findnext(handle, &fileinfo) == 0);
_findclose(handle);
SetCurrentDirectory( savepath );
}
class CompFile
{
public:
CompFile( ofstream& f )
: fout( f )
{
}
void operator()( string file);
private:
ofstream& fout;
};
void CompFile::operator()( string file )
{
size_t nlen = file.length();
fout.write( (char*)&nlen, 4 );
fout.write( file.c_str(), nlen );
ifstream fin( file.c_str(), ios::binary );
fin.seekg( 0, ios::end );
uLongf len = fin.tellg();
char* buf = new char[ len*2 ];
fin.seekg( 0, ios::beg );
fin.read( buf, len );
uLongf bufLen = len;
char* dest = buf+len;
compress( (Bytef*)dest, &bufLen, (Bytef*)buf, len );
fout.write( (char*)&bufLen, 4 );
fout.write( dest, bufLen );
delete[] buf;
}
int main(int argc, char* argv[])
{
if ( argc < 3 )
{
return 0;
}
vector<string> names;
recursiveGetFileNames( names, argv[2] );
ofstream fout( argv[1], ios::binary );
for_each( names.begin(), names.end(), CompFile(fout) );
}
‘拾’ 在Linux下,用zlib写解压文件的C程序,需要事先知道文件压缩前的大小么怎么得到
.gz文件的最后4字节就是压缩前的原长度(ISIZE),并且倒数第二个4字节是压缩前原buffer的CRC32冗余校验值。参见标准文档 rfc1952 (https://tools.ietf.org/html/rfc1952).