青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-90  評(píng)論-947  文章-0  trackbacks-0

實(shí)際應(yīng)用中有時(shí)候會(huì)遇到需要處理 ZIP 壓縮解壓的情況,這時(shí)候我們有大概三種選擇:

  1. 調(diào)用 rar.exe, unzip.exe 等
  2. 使用某現(xiàn)成庫(kù)
  3. 完全手寫(xiě)

第一種雖然能完成任務(wù),但是沒(méi)法知曉結(jié)果。曾經(jīng)有人對(duì)說(shuō),可以抓命令行輸出結(jié)果來(lái)判斷……這種依靠界面文字來(lái)進(jìn)行精確判斷的行為個(gè)人認(rèn)為相當(dāng)不靠譜。第三種,既然我是個(gè)“造輪主義”者,當(dāng)然說(shuō)好,但是現(xiàn)在我不了解 ZIP 格式,也不了解 ZIP 算法,所以這個(gè)日后再說(shuō)。今天我們就來(lái)切切實(shí)實(shí)地用一次輪子。

ZIP 相關(guān)的庫(kù)中比較有名的可能就是 ZLib 和 InfoZip(unzip60)了。InfoZip 我了解的不多,其外層接口似乎也不大好,一堆回調(diào)——回調(diào)是個(gè)很煩人的東西,專(zhuān)門(mén)用來(lái)打亂代碼結(jié)構(gòu)。另外,這個(gè)庫(kù)也已經(jīng)有好多年沒(méi)更新了吧,太久的東西給人的感覺(jué)總是不太舒服。ZLib 最新版本是 1.2.5,今年 4 月 19 日出的。確切的說(shuō),ZLib 可能并不是一個(gè)針對(duì) ZIP 文件的庫(kù),它只是一個(gè)針對(duì) gzip 以及 deflate 算法的庫(kù)。它提供了一個(gè)叫做 minizip (contrib\minizip) 例子來(lái)給出操作 ZIP 文件的方法。下文將從 ZLib 出發(fā),歸結(jié)出兩個(gè)傻瓜接口:

BOOL ZipCompress(LPCTSTR lpszSourceFiles, LPCTSTR lpszDestFile);
BOOL ZipExtract(LPCTSTR lpszSourceFile, LPCTSTR lpszDestFolder);

要引入的源文件

  1. ZLib 主目錄下的代碼,除 minigzip.c、example.c 外;
  2. contrib\minizip 下的代碼,除 minizip.c、miniunz.c 外。

相關(guān) API

雖然 minizip 更像是個(gè)例子,但是除去其主程序 minizip.c 和 miniunz.c 后,剩下的部分我們可以看作是 ZLib 的一個(gè)上層庫(kù),它封裝了與 ZIP 文件格式相關(guān)的操作。而 minizip.c 和 miniunz.c 就是我們要改寫(xiě)的——把它從命令行程序改為上述傻瓜接口。minizip.c 和 miniunz.c 中用到的 API 主要有:

壓縮相關(guān):

  1. zipOpen64
  2. zipClose
  3. zipOpenNewFileInZip
  4. zipCloseFileInZip
  5. zipWriteInFileInZip

解壓相關(guān):

  1. unzOpen64
  2. unzClose
  3. unzGetGlobalInfo64
  4. unzGoToNextFile
  5. unzGetCurrentFileInfo64
  6. unzOpenCurrentFile
  7. unzCloseCurrentFile
  8. unzReadCurrentFile

想必看到這些名字都能猜到怎么用了吧。好的接口果然能帶給人愉悅的。minizip 中的這些函數(shù)有的是帶“64”的有的是不帶的,有的還有“2”、“3”、“4”版本。這里一律用帶 64 的,不帶“2”、“3”、“4”的。

具體操作

下文涉及的所有操作,其相關(guān)代碼都可以在 http://zlibwrap.codeplex.com/ 上找到(Change Set 2450)。這里就不貼長(zhǎng)篇代碼了。另外有個(gè) DLL版本Lib版本,供拿來(lái)主義者用。

首先是壓縮操作。使用 zipOpen64 來(lái)打開(kāi)/創(chuàng)建一個(gè) ZIP 文件,然后開(kāi)始遍歷要被放到壓縮包中去的文件。針對(duì)每個(gè)文件,先調(diào)用一次 zipOpenNewFileInZip,然后開(kāi)始讀原始文件數(shù)據(jù),使用 zipWriteInFileInZip 來(lái)寫(xiě)入到 ZIP 文件中去。zipOpenNewFileInZip 的第三個(gè)參數(shù)是一個(gè) zip_fileinfo 結(jié)構(gòu),該結(jié)構(gòu)數(shù)據(jù)可全部置零,其中 dosDate 可用于填入一個(gè)時(shí)間(LastModificationTime)。它的第二個(gè)參數(shù)是 ZIP 中的文件名,若要保持目錄結(jié)構(gòu),該參數(shù)中可以保留路徑,如 foo/bar.txt。

解壓操作稍微復(fù)雜一點(diǎn)點(diǎn)。打開(kāi)一個(gè) ZIP 文件后,需要先使用 unzGetGlobalInfo64 來(lái)取得該文件的一些信息,來(lái)了解這個(gè)壓縮包里一共包含了多少個(gè)文件,等等。目前我們用得著的就是這個(gè)文件數(shù)目。然后開(kāi)始遍歷 ZIP 中的文件,初始時(shí)自動(dòng)會(huì)定位在第一個(gè)文件,以后處理完一個(gè)后用 unzGoToNextFile 來(lái)跳到下一個(gè)文件。對(duì)于每個(gè)內(nèi)部文件,可用 unzGetCurrentFileInfo64 來(lái)查內(nèi)部文件名。這個(gè)文件名和剛才 zipOpenNewFileInZip 的第二個(gè)參數(shù)是一樣的形式,所以有可能包含路徑。也有可能會(huì)以路徑分隔符(/)結(jié)尾,表明這是個(gè)目錄項(xiàng)(其實(shí)壓縮操作的時(shí)候也可以針對(duì)目錄寫(xiě)入這樣的內(nèi)部文件,上面沒(méi)有做)。所以接下來(lái)要根據(jù)情況創(chuàng)建(多級(jí))目錄。unzGetCurrentFileInfo64 的第三個(gè)參數(shù)是 unz_file_info64 結(jié)構(gòu),其中也有一項(xiàng)包含了 dosDate 信息,可以還原文件時(shí)間。對(duì)于非目錄的內(nèi)部文件,用 unzOpenCurrentFile,打開(kāi),然后 unzReadCurrentFile 讀取文件內(nèi)容,寫(xiě)入到真實(shí)文件中。unzReadCurrentFile 返回 0 表示文件讀取結(jié)束。

局限性

  1. 只能壓縮、解壓采用 deflate 算法的 ZIP 文件。(不過(guò)此類(lèi) ZIP 應(yīng)該占了絕大多數(shù))
  2. 由于 minizip 中相關(guān) API 的限制,以及 ZIP 文件格式的限制,被壓縮/解壓的相關(guān)文件名必須與系統(tǒng)的當(dāng)前代碼頁(yè)相符合。(雖然 ZIP 格式最近一次更新加入了使用 UTF8 編碼文件名的選項(xiàng),但是不能保證所遇到的 ZIP 文件都是新格式的,minizip 中似乎也沒(méi)有針對(duì)此選項(xiàng)做什么動(dòng)作。)

尾聲

這是一篇低俗的文章,沒(méi)有什么思想性。僅僅是一個(gè)小記。有不當(dāng)之處歡迎批評(píng)指正。

 

祝大家中秋節(jié)快樂(lè)!

posted on 2010-09-22 23:57 溪流 閱讀(46997) 評(píng)論(75)  編輯 收藏 引用 所屬分類(lèi): C++

評(píng)論:
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2010-09-23 12:34 | ok
visio 2010 破解怎么下載  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2010-09-24 22:52 | Corner Zhang
不錯(cuò) 對(duì)我有用!  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2010-09-28 17:26 | tomren
及時(shí)雨!  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2010-09-29 10:46 | tomren
解壓縮的時(shí)候如果多級(jí)目錄會(huì)有問(wèn)題,我那個(gè)里面有3層~~謝謝啦  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2010-09-29 20:48 | 溪流
@tomren
感謝告知,現(xiàn)在加班,等回去測(cè)試~  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2010-09-29 22:10 | 溪流
@tomren
謝謝指出,確實(shí)有此問(wèn)題,已修復(fù)。  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2010-09-30 16:04 | tomren
我只用到解壓的,直接用zLib我不會(huì)~~  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2010-10-03 21:43 | roger
如果一次壓縮幾個(gè)文件要怎么辦呢?  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2010-10-04 00:23 | 溪流
@roger
目前我已給出的代碼中,可以做到壓縮一個(gè)目錄。比如把文件都放在 aaa 目錄下,然后用 ZipCompress(_T("aaa\\*"), _T("bbb.zip")) 就可以了。

如果文件處于不同目錄中,請(qǐng)使用 MiniZip 的 API:

zipOpen64 后,對(duì)于每個(gè)文件,做如下事情
{
先zipOpenNewFileInZip,這里有個(gè)參數(shù)Zip中的文件名,可以用來(lái)組織Zip中的文件結(jié)構(gòu)
再打開(kāi)需要壓入zip中區(qū)的文件,讀取文件數(shù)據(jù)并使用zipWriteInFileInZip寫(xiě)入
最后zipCloseFileInZip
}
最后zipClose   回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2010-11-16 10:36 | Husiwa
樓主是BY人吧 呵呵  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2010-11-16 11:14 | 溪流
@Husiwa
BY是啥?  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2010-11-16 11:34 | Husiwa
@溪流
啊 北郵。。呵呵 也許我記錯(cuò)了 好像在北郵人論壇上見(jiàn)過(guò)這個(gè)ID

你這個(gè)項(xiàng)目是2010的。。。我這只有2008的
改的我好辛苦啊,還沒(méi)改完  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2010-11-16 13:04 | 溪流
@Husiwa
呵呵,偶不是by的~  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2010-11-25 14:42 | Alemon
@溪流
ZWZipExtract(_T("d:\\guoh.rar"), _T("d:\\"))
返回錯(cuò)誤為,文件名 目錄名或卷標(biāo)語(yǔ)法不對(duì),應(yīng)該怎么寫(xiě),有沒(méi)有VC6.0的版本呢?謝謝  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2010-11-25 15:31 | 溪流
@Alemon
只能解ZIP,解不了RAR。
  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2010-11-25 20:08 | Alemon
@溪流
那個(gè)是筆誤,改成ZIP后問(wèn)題依舊,就是不知道為什么是那個(gè)錯(cuò)誤提示  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2010-11-25 20:13 | Alemon
@溪流
因?yàn)槭诸^沒(méi)有2010,所以你的源碼也沒(méi)法用,就用了你的DLL版本,在壓縮的時(shí)候就是報(bào)文件名 目錄名或卷標(biāo)語(yǔ)法不對(duì),我主要用來(lái)解壓縮文件夾

BOOL bRet = ZWZipCompress(_T("d:\\systemp.mdb"), _T("d:\\temp.zip"));

代碼如上
  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2010-11-26 00:58 | 溪流
@Alemon
可能是編碼問(wèn)題吧,我的DLL是Unicode的,你的工程應(yīng)該是_MBCS的吧。這樣子試試:
BOOL bRet = ZWZipCompress(L"d:\\systemp.mdb", L"d:\\temp.zip");

  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-05-13 11:19 | 風(fēng)聲邊界
拜讀樓主的博客,寫(xiě)的很好,我已參照你的方法,寫(xiě)了壓縮文件夾模塊
但其中有個(gè)問(wèn)題,就是如果在要壓縮的文件夾中存在zip文件,該如何處理
直接將其當(dāng)做普通文件創(chuàng)建,讀取數(shù)據(jù),寫(xiě)入數(shù)據(jù),在解壓的時(shí)候就會(huì)報(bào)錯(cuò)
不知道此類(lèi)問(wèn)題,樓主有何見(jiàn)解,  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-05-13 13:47 | 溪流
@風(fēng)聲邊界
當(dāng)作普通文件處理,ZIP格式保證了其中可以含有ZIP文件。
編譯示例代碼,運(yùn)行 ZLibWrapTest.exe 測(cè)試看看?我試過(guò)好像沒(méi)問(wèn)題。  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-05-13 20:38 | weihua1984
@溪流
簡(jiǎn)單的壓縮一個(gè)zip文件到zip文件中確實(shí)沒(méi)有問(wèn)題
使用winrar工具解壓剛壓縮的zip文件沒(méi)有問(wèn)題,
使用zlib解壓剛才的壓縮的zip文件時(shí)出錯(cuò)了,我再檢查檢查,方便的話(huà)麻煩你也給看看這兩種情況,驗(yàn)證一下
  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-05-13 20:47 | weihua1984
又測(cè)試了一遍,在我的機(jī)子上測(cè)試沒(méi)有問(wèn)題,今天再公司不知道哪出了點(diǎn)問(wèn)題,謝謝!  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-05-27 10:12 | SOS
請(qǐng)問(wèn)目錄中含有空文件夾怎么壓啊,你的代碼中并沒(méi)有處理這種情況  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-05-27 11:34 | 溪流
@SOS
那就 zipOpenNewFileInZip,然后直接 zipCloseFileInZip,不要寫(xiě)數(shù)據(jù)了
我記得處理過(guò)的,等下檢查下  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-05-27 11:45 | 溪流
@SOS
嗯,我有處理的,目錄的話(huà) zipOpenNewFileInZip 里那個(gè) ZIP中的文件名加一個(gè)“/”,然后不要添加數(shù)據(jù)直接zipCloseFileInZip就可以了  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-06-02 16:54 | violin
我要在vc6.0下用,改動(dòng)會(huì)大嗎?支持壓縮多個(gè)文件不?  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-06-02 17:56 | 溪流
@violin
如果用DLL或LIB的話(huà),注意傳入U(xiǎn)NICODE字符串就可以了。
如果要源代碼方式重用的話(huà),不知道改動(dòng)大不大。
支持多文件  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-06-02 21:12 | violin
@溪流
在vc6.0中我引入dll庫(kù),編譯時(shí)報(bào)錯(cuò)Linking...
Main.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) int __cdecl ZWZipExtract(char const *,char const *)" (__imp_?ZWZipExtract@@YAHPBD0@Z)
這是什么原因呢?  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-06-02 21:33 | violin
@溪流
注:我已經(jīng)將ZLibWrap.lib加入到input中去了  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-06-02 22:08 | 溪流
@violin
ZLibWrap.h 改一下,所有參數(shù)里的 LPCTSTR 中的 T 改成 W。(不是去掉 T,昨天打太快了說(shuō)錯(cuò)了)  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-06-03 10:36 | violin
@溪流
呵呵,謝謝你的耐心回復(fù)。我按你今天的方式也弄了,LINK : fatal error LNK1196: invalid or corrupt import object: unknown version,我查了一下,估計(jì)vs2010編譯的dll,在vc6.0中還是有問(wèn)題。估計(jì)得把源碼放在vc6.0中重新生成庫(kù)才行。
還有就是昨天裝了2010,結(jié)果打開(kāi)你給的源碼,想測(cè)試下代碼的效果。結(jié)果編譯不過(guò),老是報(bào)atldef.h之類(lèi)庫(kù)文件出錯(cuò)。沒(méi)用過(guò)2010,不知道怎么回事。  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-06-03 11:37 | 溪流
@violin
可能真要重新編譯吧,我也沒(méi)試過(guò)這樣的操作。
后面的2010,直接打開(kāi)solution編譯,應(yīng)該就可以了的。你的問(wèn)題我沒(méi)碰到過(guò),同不知道怎么回事。。  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件[未登錄](méi) 2011-06-08 10:14 | neo
由于需要,我設(shè)置不是unicode環(huán)境,編譯時(shí)說(shuō)無(wú)法解析的外部符號(hào) "__declspec(dllimport) int __cdecl ZWZipCompress(char const *,char const *)" (__imp_?ZWZipCompress@@YAHPBD0@Z),該符號(hào)在函數(shù) _main 中被引用
怎么辦  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件[未登錄](méi) 2011-06-08 10:41 | neo
看來(lái)用DLL不能用非UNICODE環(huán)境對(duì)吧?
那我想定義一個(gè)變量,比如char str[].然后在程序運(yùn)行的時(shí)候?qū)λx值,然后作為ZWZIPCOMPRESS的一個(gè)輸入?yún)?shù),可是編譯器提示無(wú)法轉(zhuǎn)換成LPCTSTR,這怎么解決呢。  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-06-09 00:10 | 溪流
@neo
看樓上的一些回答吧。
  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件[未登錄](méi) 2011-06-09 16:25 | neo
@溪流
樓上并沒(méi)有說(shuō)怎么轉(zhuǎn)換,不過(guò)我已經(jīng)解決了,用A2T函數(shù)來(lái)轉(zhuǎn)換  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-06-23 09:38 | xx
你符號(hào)鏈接(軟鏈接)怎么處理?  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-06-23 13:25 | 溪流
@xx
軟硬鏈接沒(méi)有作特殊處理,看它們對(duì) CreateFile 是否透明。這是兩個(gè)層次的概念,竊以為不該越權(quán)去處理。  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-06-23 16:47 | xx
文件屬性?  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-06-23 22:54 | 溪流
@xx
ZIP格式可能無(wú)法容納文件屬性以及NTFS權(quán)限等信息。好像就一個(gè)修改時(shí)間能保存吧。  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-07-08 16:25 | 11
超過(guò)4G文件可壓縮否  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-07-19 17:12 | cy
先下來(lái)看看。  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-08-21 13:38 | 大傻(605351006@qq.com)
太有用了,非常感謝!  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-08-26 09:51 | py
如果壓縮要求從內(nèi)存中直接壓縮到內(nèi)存呢?
解壓要求從數(shù)據(jù)流直接解壓到內(nèi)存中呢?  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-08-27 23:52 | 溪流
@py
這個(gè)跟ZIP文件無(wú)關(guān)了吧。貌似ZLIB有提供數(shù)據(jù)壓縮接口,好像直接叫compress什么的?  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-09-01 09:19 | Samson
如何使用crc呢?好像沒(méi)有使用crc的接口  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-10-29 18:46 | weihua1984
今天使用zlib又出現(xiàn)問(wèn)題了
用zlib封裝了壓縮和加壓縮兩個(gè)接口
1、文件都是gbk的時(shí)候,壓縮和解壓縮都沒(méi)有問(wèn)題
2、文件有utf8個(gè)時(shí)候的時(shí)候,壓縮,沒(méi)有問(wèn)題,但是使用我的解壓縮接口時(shí),解壓時(shí)候,此時(shí)用windows"右擊解壓" 還是可以解壓的

所在現(xiàn)在不清楚是我壓縮的問(wèn)題還是解壓的問(wèn)題

是不是由必要考慮文本編碼在壓縮時(shí)轉(zhuǎn)換的問(wèn)題

在局限性中你所說(shuō)的

雖然 ZIP 格式最近一次更新加入了使用 UTF8 編碼文件名的選項(xiàng),但是不能保證所遇到的 ZIP 文件都是新格式的,minizip 中似乎也沒(méi)有針對(duì)此選項(xiàng)做什么動(dòng)作。

我應(yīng)該如何理解和應(yīng)對(duì)哪  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-11-17 01:06 | 溪流
@weihua1984
參考 http://www.pkware.com/documents/casestudies/APPNOTE.TXT 中的說(shuō)明,需要將對(duì)應(yīng)文件項(xiàng)的 General Purpose Bit Flag 標(biāo)志的 BIT 11 設(shè)上。

在 minizip 中,可以使用 zipOpenNewFileInZip4 代替上面的 zipOpenNewFileInZip,zipOpenNewFileInZip4 最后的那個(gè)參數(shù)就是剛才說(shuō)的 Flag,給他傳個(gè) 0x800,同時(shí)文件名傳 utf-8 的,就可以了,試過(guò) WinRAR 能順利解壓。不過(guò)有個(gè)問(wèn)題,如果目錄名這樣搞,似乎 WinRAR 不能解,不知道應(yīng)該怎么弄。

同時(shí),解壓的時(shí)候由 unzGetCurrentFileInfo64 取到 unz_file_info64 后,也需要判斷一下其 flag 成員的 BIT 11 是否設(shè)上,然后根據(jù)不同的編碼解析文件名。

剛才說(shuō)的目錄名,如果那樣搞,只要解壓的時(shí)候作對(duì),自己解自己是沒(méi)問(wèn)題的,只是 WinRAR 解不了,,,待研究。

http://zlibwrap.codeplex.com/ 上代碼已更新。  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2011-11-17 01:35 | 溪流
哦,知道了,zipOpenNewFileInZip4 的時(shí)候 FileInfo.external_fa 設(shè)上 FILE_ATTRIBUTE_DIRECTORY 表示此項(xiàng)是目錄。  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2012-01-04 22:58 | dafan
哥們,測(cè)試下,貌似不支持中文文件名
無(wú)論是生成的目的文件中文還是待壓縮文件夾里包含中文。
你也測(cè)試下吧 :)  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2012-01-04 22:59 | dafan
包含中文文件@dafan
  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2012-01-05 21:03 | 溪流
@dafan
可以啊,專(zhuān)門(mén)為這個(gè)問(wèn)題測(cè)過(guò)好多時(shí)間。請(qǐng)問(wèn)你的用例是怎樣的?  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2012-01-06 10:47 | dafan
@溪流
奇怪了 我這里就是不行
我使用的是win7 英文版操作系統(tǒng)
就是直接在文件夾里放一個(gè)中文文件  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2012-01-06 10:47 | dafan
此外,把文件存儲(chǔ)在包含中文的路徑下也不行呢  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2012-01-06 23:25 | 溪流
@dafan
看看 控制面板=>區(qū)域和語(yǔ)言選項(xiàng)=>管理=>非Unicode程序的語(yǔ)言 那里設(shè)置成什么?  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2012-01-07 16:07 | 溪流
@dafan
如果那里設(shè)置不是中文的話(huà),請(qǐng)壓縮的時(shí)候選擇 utf8 文件名。
ZipCompress 以及 ZWZipCompress 中的最后一個(gè)參數(shù) bUtf8 設(shè)為 true 即可,如果是用 ZLibWrapText.exe 測(cè)試的,把 /utf8 設(shè)上。  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件[未登錄](méi) 2012-10-15 14:32 | loong
實(shí)際上樓主的接口是用的minizip的接口在用

最近想找找直接使用zlib的接口,不用minizip的接口。

因?yàn)閙inizip這個(gè)庫(kù) 在他的網(wǎng)站上沒(méi)有找到license。怕出問(wèn)題。  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2012-10-15 14:54 | 溪流
@loong
沒(méi)錯(cuò)。
不過(guò)在minizip在zip.h/unzip.h中有版權(quán)說(shuō)明。
Condition of use and distribution are the same than zlib
在contrib\minizip\MiniZip64_info.txt中也有版權(quán)說(shuō)明。

如果不用minizip的話(huà),相當(dāng)于要自己解析zip文件格式了。  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2012-12-25 01:20 | NuClient
請(qǐng)問(wèn)用winrar壓縮的zip檔案 能用minizip解開(kāi)嗎  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2012-12-25 13:47 | 溪流
@NuClient
理論上應(yīng)該可以吧,zip格式好久沒(méi)變過(guò)了吧。試一下唄  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件[未登錄](méi) 2012-12-31 14:25 | ben
學(xué)習(xí)了  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2013-04-06 15:49 | lycheng
LZ 你好
如果是使用 zip 2.0 加密的zip 文件就無(wú)法解壓,我看源代碼頁(yè)好像沒(méi)有通過(guò)調(diào)用解壓那部分函數(shù),不知道能否看下?  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2013-05-04 23:04 | 溪流
@lycheng
不好意思回復(fù)晚了。
我這邊確實(shí)沒(méi)有支持加密的文件。
不過(guò)minizip看上去是支持的,試試把unzOpenCurrentFile換成unzOpenCurrentFilePassword?  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2013-05-12 21:26 | lycheng
@溪流

好的,謝謝你了
  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2013-10-29 09:00 | lbx
博主 請(qǐng)問(wèn)你的源碼添加crc校驗(yàn)了嗎?希望能有這部分的代碼  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2014-02-22 16:32 | 依彩帆
# re: 使用 ZLib 壓縮/解壓 ZIP 文件[未登錄](méi) 2014-05-16 11:10 | dd
樓主 少了FindClose 吧  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件[未登錄](méi) 2014-05-16 11:46 | dd
通過(guò)LOKI_ON_BLOCK_EXIT實(shí)現(xiàn)了。。。@dd  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2014-11-14 15:15 | OH NO
1>ZLibWrapLib.lib(ZLibWrapLib.obj) : error LNK2001: 無(wú)法解析的外部符號(hào) "class ATL::CAtlStringMgr ATL::g_strmgr" (?g_strmgr@ATL@@3VCAtlStringMgr@1@A)  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2014-11-14 21:00 | 溪流
@OH NO
可能我們用的編譯器不一樣,下載代碼重新編譯唄  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2015-09-24 19:39 | bowman
謝博主,項(xiàng)目中用了好久了  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2015-09-29 16:20 | 胡峻華
非常具有實(shí)用性的代碼。
感謝博主分享。
學(xué)習(xí)了!  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2016-05-12 15:40 | shellxi
博主,我用uncompress解壓文件的時(shí)候必須是compress自己壓縮的文件,用博主提供的api也一樣,有沒(méi)有什么方法是可以解壓比如WinRAR壓縮的zip文件的啊?一定要回答我啊!!!工作上要用弄了好久都不行!!!跪謝!  回復(fù)  更多評(píng)論
  
# re: 使用 ZLib 壓縮/解壓 ZIP 文件 2022-11-10 15:00 | 溪流
@shellxi
應(yīng)該能解的呀,您的文件提供給我看下?  回復(fù)  更多評(píng)論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品久久中文| 国产三区二区一区久久| 国产精品乱码久久久久久| 欧美va天堂在线| 小黄鸭精品密入口导航| 在线视频亚洲一区| 亚洲无线观看| 亚洲欧美日韩在线一区| 亚洲欧美在线观看| 久久精彩视频| 欧美高清一区二区| 亚洲精品影视| 亚洲一区二区在| 欧美一区二视频| 麻豆精品传媒视频| 欧美日韩一区二区视频在线| 久久午夜av| 先锋影音国产一区| 欧美11—12娇小xxxx| 欧美激情第1页| 国产欧美日韩亚州综合| 亚洲第一精品福利| 夜夜嗨av色一区二区不卡| 欧美一区二区视频97| 欧美成人综合一区| 中文久久乱码一区二区| 久久婷婷国产综合尤物精品| 欧美日韩中文字幕在线视频| 国产在线欧美| 一区二区三区国产精品| 亚洲国内精品在线| 欧美资源在线| 久久久久天天天天| 欧美高清视频一区| 亚洲国产影院| 亚洲一区二区黄色| 久久久久久午夜| 欧美视频不卡| 亚洲精品在线视频观看| 亚洲精品久久久久| 欧美在线观看网址综合| 欧美日本韩国一区| 亚洲国产精品久久| 久久蜜桃精品| 亚洲欧美日韩系列| 欧美日韩大片一区二区三区| 亚洲高清久久网| 久久精品国产99国产精品| 99在线精品视频| 欧美成人情趣视频| 亚洲国产1区| 久久久国际精品| 欧美激情国产日韩| 在线精品观看| 久久久国产精品一区二区中文 | 久久精品国产一区二区电影| 欧美色综合网| 日韩一区二区免费高清| 欧美大香线蕉线伊人久久国产精品| 亚洲女同精品视频| 国产精品国产精品国产专区不蜜| 日韩一级精品视频在线观看| 欧美成人情趣视频| 老司机免费视频久久| 在线播放日韩专区| aa级大片欧美三级| 欧美成人精品h版在线观看| 羞羞漫画18久久大片| 国产精品一区三区| 久久爱www| 欧美一区二区三区免费观看视频| 国产精品自在在线| 91久久精品一区二区三区| 久久综合给合| 欧美不卡一区| 最新国产の精品合集bt伙计| 91久久国产综合久久| 久久一区二区视频| 一区精品在线| 亚洲永久免费av| 99热这里只有精品8| 亚洲欧美国产日韩天堂区| 久久精品在线| 好吊日精品视频| 欧美第十八页| 欧美精品久久久久久久久老牛影院| 日韩午夜黄色| 一本大道久久精品懂色aⅴ| 影音先锋中文字幕一区| 久久久久久国产精品一区| 亚洲国产婷婷综合在线精品 | 一区二区三区四区国产精品| 亚洲午夜电影在线观看| 国产一区二区精品| 亚洲国产成人午夜在线一区| 欧美日韩人人澡狠狠躁视频| 欧美自拍偷拍| 欧美激情1区2区3区| 国产精品久久久久久模特| 国产婷婷精品| 欧美激情中文不卡| 国产精品入口麻豆原神| 欧美黑人多人双交| 国产精品日韩电影| 欧美成人日韩| 国产欧美精品日韩区二区麻豆天美| 麻豆精品在线播放| 国产精品扒开腿做爽爽爽视频| 开心色5月久久精品| 欧美亚洲第一区| 欧美成人激情视频| 国产精自产拍久久久久久| 亚洲国产老妈| 一区二区在线免费观看| 一区二区欧美国产| 欧美日韩岛国| 亚洲日本aⅴ片在线观看香蕉| 亚洲国产欧美一区| 欧美岛国在线观看| 99re6热只有精品免费观看| 亚洲毛片视频| 欧美日韩国产在线播放网站| 亚洲免费av电影| 亚洲午夜日本在线观看| 激情自拍一区| 夜夜嗨av一区二区三区网页| 亚洲欧美成人| 欧美高清视频在线| 免费成人黄色片| 国产综合网站| 亚洲欧美国产精品专区久久| 在线亚洲国产精品网站| 免费国产自线拍一欧美视频| 久久影院午夜论| 国内精品视频在线观看| 午夜精品短视频| 亚洲欧美一区二区三区在线| 欧美日韩三级电影在线| 亚洲欧洲免费视频| 亚洲电影在线免费观看| 久久三级视频| 欧美高清在线视频观看不卡| 亚洲人妖在线| 亚洲一区二区三区精品视频| 欧美福利视频一区| 亚洲人午夜精品| 亚洲精品国产欧美| 欧美精品七区| 99视频精品| 亚洲午夜精品视频| 国产精品久久网站| 欧美亚洲免费高清在线观看| 欧美伊人久久久久久久久影院 | 亚洲成在线观看| 亚洲欧洲另类| 欧美14一18处毛片| 99av国产精品欲麻豆| 欧美电影电视剧在线观看| 亚洲国产日韩美| 中文成人激情娱乐网| 欧美日韩中文字幕精品| 亚洲欧美日产图| 久久米奇亚洲| 亚洲老板91色精品久久| 国产精品高潮呻吟| 久久精品国产精品亚洲| 亚洲国产日韩一区| 午夜精品视频| 亚洲国产成人一区| 欧美日韩综合视频网址| 性欧美激情精品| 亚洲成色777777在线观看影院| 99在线热播精品免费| 国产精品女主播在线观看| 久久久久国产精品人| 日韩午夜激情| 老牛影视一区二区三区| 国产乱子伦一区二区三区国色天香 | 亚洲精品国产系列| 国产精品免费一区豆花| 久久久久九九九| 夜夜嗨av一区二区三区中文字幕| 欧美在线999| 日韩亚洲国产精品| 国产在线欧美日韩| 欧美性色aⅴ视频一区日韩精品| 欧美在线播放高清精品| 亚洲蜜桃精久久久久久久| 快射av在线播放一区| 亚洲中无吗在线| 亚洲精品欧美日韩专区| 国产日韩欧美亚洲| 欧美性开放视频| 欧美精品一区二区三区在线看午夜| 香蕉久久夜色精品| 亚洲美女在线看| 亚洲大胆在线| 久久婷婷蜜乳一本欲蜜臀| 亚洲欧美日产图| 亚洲午夜高清视频|