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).