一起学习PHP的rar解压读取扩展包吧@本文来*源gaodai#ma#com搞*!代#%^码$网*!
PHP的rar解压读取扩展包学习
作为压缩解压方面的扩展学习,两大王牌压缩格式 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.htm echo $gameEntry->getUnpackedSize(), PHP_EOL; // 56063 $gameEntryNo = rar_entry_get($arch, "ldxlcs/ldxlcs/game.htm"); echo $gameEntry->getName(), PHP_EOL; // ldxlcs/ldxlcs/game.htm echo $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 对象。接下来,就是这个对象的一些操作。