日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

PHP實現rar解壓讀取擴展包小結

瀏覽:38日期:2022-09-07 08:52:09

作為壓縮解壓方面的擴展學習,兩大王牌壓縮格式 rar 和 zip 一直是計算機領域的壓縮終結者。rar 格式的壓縮包是 Windows 系統中有接近統治地位的存在,今天我們學習的 PHP 擴展就是針對于 rar 的壓縮包操作,不過,PHP 的 rar 擴展僅能讀取和解壓 rar 格式的壓縮包,并不能進行壓縮操作。

php-rar 擴展在 pecl 的安裝包已經過時了,無法在 PHP7 中使用,我們需要使用它在 github 上的源碼進行編譯安裝才能夠在 PHP7 的環境下安裝成功。

https://github.com/cataphract/php-rar

直接 git clone 之后就可以按正常的 PHP 擴展的方式進行安裝。

獲取壓縮包句柄 RarArchive

$arch = RarArchive::open('test.rar');$archNo = rar_open('test.rar');echo $arch, PHP_EOL; // RAR Archive '/data/www/blog/test.rar'echo $archNo, PHP_EOL; // RAR Archive '/data/www/blog/test.rar'$arch->close();rar_close($archNo);echo $arch, PHP_EOL; // RAR Archive '/data/www/blog/test.rar' (closed)echo $archNo, PHP_EOL; // RAR Archive '/data/www/blog/test.rar' (closed)

php-rar 擴展有兩種形式的寫法,一種是面向對象的,也就是使用 RarArchive 類來操作壓縮包。另一種方式就是直接使用一個函數 rar_open 用來獲取一個 rar 文件的句柄。它們都重寫了 __toString 方法,所以我們可以直接打印句柄的內容看到當前句柄所操作的具體文件。

當我們關閉句柄時,句柄對象依然能夠進行輸出,但后面會顯示一個 closed 。這時的句柄對象已經不能進行其它操作了。

$arch = RarArchive::open('test.rar');$archNo = rar_open('test.rar');echo $arch->getComment(), PHP_EOL;echo $arch->isBroken(), PHP_EOL;echo $arch->isSolid(), PHP_EOL;echo rar_comment_get($archNo), PHP_EOL;echo rar_broken_is($archNo), PHP_EOL;echo rar_solid_is($archNo), PHP_EOL;echo $arch->setAllowBroken(true), PHP_EOL;echo rar_allow_broken_set($archNo, true), PHP_EOL;

RarArchive 對象的一些方法可以幫我們獲取當前壓縮包的信息。比如 getComment() 獲取壓縮包的說明信息,isBroken() 獲取當前壓縮包是否有損壞,isSolid() 檢查當前壓縮包是否可用。而 setAllowBroken() 方法是讓我們允許對損壞的壓縮包進行操作。這里我們給出了面向對象和面向過程的寫法。

壓縮包內的每個實體文件或目錄操作 RarEntry

獲得壓縮包的句柄之后,我們就需要更進一步地獲取壓縮包內部的內容。而句柄對象中就已經保存了壓縮包內部的各個文件和目錄的對象 RarEntry 。

$gameEntry = $arch->getEntry(’ldxlcs/ldxlcs/game.htm’);echo $gameEntry->getName(), PHP_EOL; // ldxlcs/ldxlcs/game.htmecho $gameEntry->getUnpackedSize(), PHP_EOL; // 56063$gameEntryNo = rar_entry_get($arch, 'ldxlcs/ldxlcs/game.htm');echo $gameEntry->getName(), PHP_EOL; // ldxlcs/ldxlcs/game.htmecho $gameEntry->getUnpackedSize(), PHP_EOL; // 56063$fp = $gameEntryNo->getStream();while (!feof($fp)) { $buff = fread($fp, 8192); if ($buff !== false) {echo $buff; } else {break; } //fread error}// 輸出文件的全部內容echo PHP_EOL;echo ’Entry extract: ’, $gameEntry->extract('./'), PHP_EOL;

句柄對象的 getEntry() 方法就是用于獲取指定的文件或者目錄內容的。它獲取的是單個文件或目錄,所以必須明確地指定需要獲取的文件內容。通過這個方法,我們可以拿到一個 RarEntry 對象。接下來,就是這個對象的一些操作。

RarEntry 對象的 getName() 方法用于獲取文件名稱,這個文件名稱是帶路徑的,這個路徑是壓縮包內的絕對路徑。getUnpackedSize() 方法用于獲取文件的大小,getStream() 用于獲取文件流,通過 getStream() 方法,我們就可以直接打印輸出文件的內容。

當然,最最重要的是,我們可以通過 extract() 方法來直接解壓一個文件到指定的目錄。php-rar 擴展并沒有提供一個能夠完全地解壓整個壓縮包的方法,所以如果我們需要對整個壓縮包進行解壓的話,就需要通過循環遍歷壓縮包內部的全部內容來對這些文件一個一個地進行解壓。

最后,我們就來看看如何遍歷壓縮包內的全部內容。

$entries = $arch->getEntries();foreach ($entries as $en) { echo $en, PHP_EOL; echo $en->getName(), PHP_EOL; echo $en->getUnpackedSize(), PHP_EOL; echo $en->getAttr(), PHP_EOL; echo $en->getCrc(), PHP_EOL; echo $en->getFileTime(), PHP_EOL; echo $en->getHostOs(), PHP_EOL; echo $en->getMethod(), PHP_EOL; echo $en->getPackedSize(), PHP_EOL; echo $en->getVersion(), PHP_EOL; echo $en->isDirectory(), PHP_EOL; echo $en->isEncrypted(), PHP_EOL;}// 壓縮包中所有文件的內容// RarEntry for file 'ldxlcs/ldxlcs/game.htm' (3c19abf6)// ldxlcs/ldxlcs/game.htm// 56063// 32// 3c19abf6// 2017-09-10 13:25:04// 2// 51// 7049// 200// ……$entriesNo = rar_list($archNo);foreach ($entriesNo as $en) { echo $en->getName(), PHP_EOL;}

直接使用的是 RarArchive 對象的 getEntries() 方法,我們通過這個方法可以獲得一個 RarEntry 對象的數組,里面包含的就是這個 rar 壓縮包里面的全部內容。在這段代碼中,我們還打印了 RarEntry 對象的其它一些屬性方法,根據名稱也能大概了解這些方法都是獲取關于文件的各種信息的,大家可以自行測試。

異常處理

最后,如果打開錯了文件或者獲取壓縮包內部沒有的文件時,php-rar 擴展會以 PHP 錯誤的形式報錯。但既然提供了完整的面向對象寫法,那么它也必然提供了一套面向對象的異常處理機制。

// 不打開 UsingExceptions 全部錯誤會走 PHP 錯誤機制,打開后走 PHP 的異常機制RarException::setUsingExceptions(true);var_dump(RarException::isUsingExceptions()); // bool(true)try { $arch = RarArchive::open('test1.rar'); $arch->getEntry(’ttt.txt’);} catch (RarException $e) { var_dump($e); // object(RarException)#35 (7) { // ['message':protected]=> // string(91) 'unRAR internal error: Failed to open /data/www/blog/test1.rar: ERAR_EOPEN (file open error)' // ['string':'Exception':private]=> // string(0) '' // ['code':protected]=> // int(15) // ['file':protected]=> // string(22) '/data/www/blog/rar.php' // ['line':protected]=> // int(93) // ['trace':'Exception':private]=> // array(1) { // [0]=> // array(6) { // ['file']=> // string(22) '/data/www/blog/rar.php' // ['line']=> // int(93) // ['function']=> // string(4) 'open' // ['class']=> // string(10) 'RarArchive' // ['type']=> // string(2) '::' // ['args']=> // array(1) { // [0]=> // string(9) 'test1.rar' // } // } // } // ['previous':'Exception':private]=> // NULL // }}

只要將 RarException::setUsingExceptions() 設置為 true ,就能夠開啟 php-rar 擴展的異常處理機制,這時,我們打開一個錯誤的文件,或者去獲取壓縮包內的一個錯誤文件路徑,那么,錯誤信息就會以異常的形式進行拋出。

總結

這套擴展是不是感覺很人性化?即提供了面向對象的方式,也提供了以函數操作為主的面向過程的方式。但是,這樣做其實并沒有太多的好處,因為又要兼顧老代碼,又要兼顧新思想,本身擴展的內部實現相必也會復雜很多。我們自己寫代碼的時候就盡量不要這么寫了,在重構的時候一步步的向最新的形式遷移即可。

關于 rar 的壓縮操作并沒有找到太多有用的資料。當然,我們在生產環境中如果要生成壓縮包的話大部分情況下都會直接去生成 zip 格式的提供給用戶,畢竟大部分的客戶端軟件都是能夠同時支持 rar 和 zip 格式文件的解壓的,如果一定要指定生成 rar 的話,也可以多多和產品經理或者客戶商量。有的時候,技術的難點是可以通過業務的變通來解決的,最重要的其實還是在于溝通。

測試代碼:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202007/source/PHP%E7%9A%84rar%E8%A7%A3%E5%8E%8B%E8%AF%BB%E5%8F%96%E6%89%A9%E5%B1%95%E5%8C%85%E5%AD%A6%E4%B9%A0.php

參考文檔:https://www.php.net/manual/zh/book.rar.php

以上就是PHP的rar解壓讀取擴展包學習的詳細內容,更多關于PHP rar解壓讀取的資料請關注好吧啦網其它相關文章!

標簽: PHP
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品丝袜在线| 国产一区91| 高清一区二区三区av| 在线一区av| 9国产精品视频| 国产一区91| 国产欧美日韩| 黑森林国产精品av| 一区二区自拍| 欧美日韩1区2区3区| 久久久久久久欧美精品| 美女网站一区| 97se亚洲| 久久久久亚洲| 日韩av午夜在线观看| 97精品在线| 亚洲午夜免费| 精品一区电影| 亚洲激情二区| 久久中文在线| 免费中文字幕日韩欧美| 麻豆视频久久| 欧美中文日韩| 综合日韩av| 亚洲一区二区免费在线观看| 精品国产欧美日韩| 视频一区中文字幕| 都市激情国产精品| 在线精品视频一区| 日韩不卡一区| 综合亚洲色图| 91亚洲国产| 亚洲性视频在线| 国产一区二区精品福利地址| 六月婷婷一区| 蜜臀国产一区| 日韩黄色在线观看| 蜜臀久久99精品久久一区二区 | 美国三级日本三级久久99| 久久精品资源| 日韩一区精品| 视频一区中文| 国产成人精品一区二区免费看京| 视频一区二区国产| 日韩精品免费一区二区在线观看| 深夜日韩欧美| 伊人久久亚洲热| 理论片午夜视频在线观看| 日韩福利视频一区| 日韩一区二区久久| 97精品国产一区二区三区| 日本三级亚洲精品| 亚洲一区成人| 国产成人精品亚洲日本在线观看| 国产精品久久久久毛片大屁完整版| 国产视频一区欧美| 日韩免费看片| 精品亚洲成人| 久久国产乱子精品免费女| 三级亚洲高清视频| 99精品小视频| 91视频精品| 欧美a一区二区| 日韩一区二区三区在线看| aa国产精品| 亚洲欧美综合| 久久精品官网| 欧产日产国产精品视频| 久久精品资源| 国产精品s色| 久久激情av| 日本不卡高清| 亚洲日本久久| 日韩精品一二三区| 日韩视频久久| 久久国产毛片| 日韩欧美一区免费| 高清精品久久| 色婷婷亚洲mv天堂mv在影片| 国产精品va视频| 国产亚洲高清一区| 欧美亚洲三级| 91亚洲无吗| 日本欧美久久久久免费播放网| 综合激情一区| 亚洲精品欧洲| 中文字幕av一区二区三区人| 热久久国产精品| 欧美资源在线| 蜜臀av国产精品久久久久| 亚洲午夜电影| 久久一区二区三区电影| 久久久久久黄| 亚洲婷婷在线| 亚洲美洲欧洲综合国产一区| 国产亚洲毛片在线| 午夜一区在线| 中文字幕日韩高清在线| 婷婷五月色综合香五月| 青青伊人久久| 国产精品一区二区美女视频免费看| 欧美三级第一页| 欧美激情视频一区二区三区免费 | 综合激情一区| 日韩和欧美一区二区| 国产一级成人av| 国产精品v一区二区三区| 精品一区二区三区中文字幕| 91嫩草亚洲精品| 久久久久国产精品一区三寸| 亚洲国产专区校园欧美| 亚洲精华国产欧美| 一区二区国产在线| 青青青国产精品| 精品一区视频| 欧美精选视频一区二区| 亚洲夜间福利| 久久大逼视频| 日本久久一区| 精品日韩一区| 三上悠亚国产精品一区二区三区| 久久精品99久久无色码中文字幕| 午夜影院欧美| 亚洲精品第一| 精品免费视频| 激情久久久久久| 中文字幕一区二区三区日韩精品 | 99视频精品免费观看| 亚洲专区视频| 国产探花在线精品| 都市激情国产精品| 91久久视频| 国产日产高清欧美一区二区三区| 国产精品成人a在线观看| 99精品网站| 午夜亚洲福利| 成人高清一区| 日韩一区二区免费看| 日韩av字幕| 国产盗摄——sm在线视频| av不卡免费看| 欧美黑人做爰爽爽爽| 欧美+日本+国产+在线a∨观看| 在线一区二区三区视频| 国产精品午夜一区二区三区| 久久九九国产| 91精品国产经典在线观看| 97精品国产一区二区三区| 国产精品呻吟| 久久亚洲国产精品尤物| 精品中文字幕一区二区三区av| 日韩一区二区三区精品| yellow在线观看网址| 久久午夜影视| 韩日一区二区| 免费看的黄色欧美网站| 麻豆精品99| 欧美一级专区| 国产一区二区三区免费在线| 亚洲精品97| 国产精品男女| 尹人成人综合网| 欧美xxxx性| 老司机精品久久| 精品成人18| 亚洲我射av| 成人精品天堂一区二区三区| 日韩不卡在线观看日韩不卡视频| 成人看片网站| 国产精品第十页| 亚洲少妇一区| 97精品97| 欧美亚洲国产日韩| 亚洲经典在线| 精品午夜久久| 日韩不卡一区二区| 午夜电影亚洲| 精品久久在线| 日本成人精品| 99在线精品免费视频九九视| 国产一区二区三区精品在线观看| 三级亚洲高清视频| 99久久激情| 日产精品一区二区| 国产三级一区| 国产精品色网| 久久免费高清| 精品中文在线| 日本不卡中文字幕| 91精品福利| a日韩av网址| 国产精品久久久久久久免费软件| 国产免费成人| 99视频精品视频高清免费| 精品欧美日韩精品| 国产欧美自拍| 日韩精品一区二区三区av| 野花国产精品入口| 999国产精品视频| 97精品一区二区|