返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP如何实现rar解压读取扩展包
  • 500
分享到

PHP如何实现rar解压读取扩展包

2023-06-15 08:06:31 500人浏览 泡泡鱼
摘要

这篇文章给大家分享的是有关PHP如何实现rar解压读取扩展包的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。作为压缩解压方面的扩展学习,两大王牌压缩格式 rar 和 zip 一直是计算机领域的压缩终结者。rar 格

这篇文章给大家分享的是有关PHP如何实现rar解压读取扩展包的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

作为压缩解压方面的扩展学习,两大王牌压缩格式 rar 和 zip 一直是计算机领域的压缩终结者。rar 格式的压缩包是 windows 系统中有接近统治地位的存在,今天我们学习的 php 扩展就是针对于 rar 的压缩包操作,不过,PHP 的 rar 扩展仅能读取和解压 rar 格式的压缩包,并不能进行压缩操作。

php-rar 扩展在 pecl 的安装包已经过时了,无法在 PHP7 中使用,我们需要使用它在 GitHub 上的源码进行编译安装才能够在 PHP7 的环境下安装成功。

直接 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 扩展的异常处理机制,这时,我们打开一个错误的文件,或者去获取压缩包内的一个错误文件路径,那么,错误信息就会以异常的形式进行抛出。

感谢各位的阅读!关于“PHP如何实现rar解压读取扩展包”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: PHP如何实现rar解压读取扩展包

本文链接: https://lsjlt.com/news/279033.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • PHP如何实现rar解压读取扩展包
    这篇文章给大家分享的是有关PHP如何实现rar解压读取扩展包的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。作为压缩解压方面的扩展学习,两大王牌压缩格式 rar 和 zip 一直是计算机领域的压缩终结者。rar 格...
    99+
    2023-06-15
  • PHP实现rar解压读取扩展包小结
    作为压缩解压方面的扩展学习,两大王牌压缩格式 rar 和 zip 一直是计算机领域的压缩终结者。rar 格式的压缩包是 Windows 系统中有接近统治地位的存在,今天我们学习的 P...
    99+
    2024-04-02
  • linux如何解压rar包
    ...
    99+
    2024-04-02
  • 如何让Centos解压打包RAR
    这篇文章主要介绍“如何让Centos解压打包RAR”,在日常操作中,相信很多人在如何让Centos解压打包RAR问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何让Centos解压打包RAR”的疑惑有所帮助!...
    99+
    2023-06-10
  • java如何实现不解压直接读取压缩包中文件的
    小编给大家分享一下java如何实现不解压直接读取压缩包中文件的,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java的优点是什么1. 简单,只需理解基本的概念,就...
    99+
    2023-06-14
  • ubuntu如何安装php扩展包
    这篇文章主要介绍ubuntu如何安装php扩展包,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!ubuntu安装php扩展包的方法:首先打开命令窗口;然后通过“apt-get install”命令安装需要的php扩展库...
    99+
    2023-06-14
  • php如何获取url扩展名
    这篇文章主要介绍了php如何获取url扩展名,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。获取方法:1、用“substr(strrchr($url,".&...
    99+
    2023-06-29
  • java不解压直接读取压缩包中文件的实现方法
    前言 最近写了个上传压缩包,将压缩包中的图片保存的接口,所以翻了翻网上文件流操作的博客,总结了一个不用解压,直接读取文件的方法 上代码 @RequestMapping(valu...
    99+
    2024-04-02
  • php如何获取文件扩展名
    在PHP中,可以使用pathinfo()函数来获取文件的扩展名。pathinfo()函数可以返回一个包含有关文件路径的信息的关联数组...
    99+
    2023-10-08
    php
  • PHP ZipArchive 扩展速成指南:快速上手打包和解压缩
    PHP ZipArchive 扩展是一个强大的工具,它允许开发者轻松地打包和解压缩 ZIP 文件。本指南将深入探讨该扩展的用法,从安装和配置到打包和解压缩文件的实际示例。 安装和配置 要使用 ZipArchive 扩展,必须先在 PHP...
    99+
    2024-03-08
    PHP、ZipArchive、文件压缩、文件解压缩
  • 如何在PHP中使用bz2压缩扩展工具
    这期内容当中小编将会给大家带来有关如何在PHP中使用bz2压缩扩展工具,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。安装扩展这个扩展的安装需要系统有 bzip2-devel 。所以我们需要先给系统装上这个...
    99+
    2023-06-15
  • 宝塔面板中如何安装php压缩扩展
    这篇“宝塔面板中如何安装php压缩扩展”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“宝塔面板中如何安装php压缩扩展”文章吧...
    99+
    2023-07-05
  • PHP中Composer如何加载本地扩展包
    这篇文章将为大家详细讲解有关PHP中Composer如何加载本地扩展包,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。代码如下 项目下的 HttpServerFrame/composer...
    99+
    2023-06-15
  • 如何解析Zephir写PHP扩展
    这篇文章给大家分享的是有关如何解析Zephir写PHP扩展的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。众所周知 要写PHP扩展需要用c或者c++ 语言 配合 ext_skel 实现这样对一个没接触过c++的PH...
    99+
    2023-06-15
  • 如何在 PHP 中获取文件扩展名
    在本文中,我们将介绍在 PHP 中获取文件扩展名的方法。 使用 pathinfo() 函数 使用 SplFileInfo'结构和 getExtension’函数 ...
    99+
    2024-02-27
  • Go如何自动解压缩包?如何读取docx/doc文件内容?
    在开发过程中,我们常常需要处理压缩包和文档文件。本文将介绍如何使用Go语言自动解压缩包和读取docx/doc文件。 一、解压缩包 压缩包格式 常见的压缩包格式有zip、gzip、bzip2等。在...
    99+
    2023-09-16
    golang linux 服务器 开发语言 php
  • 批处理bat+Rar如何实现批量独立压缩目录和解压目录
    小编给大家分享一下批处理bat+Rar如何实现批量独立压缩目录和解压目录,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!c:\r\a c:\r\b cd c:\r ...
    99+
    2023-06-08
  • mongodb php扩展没有如何解决
    本文小编为大家详细介绍“mongodb php扩展没有如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“mongodb php扩展没有如何解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。mongodb p...
    99+
    2023-07-04
  • jQuery如何实现扩展功能
    这篇文章将为大家详细讲解有关jQuery如何实现扩展功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。扩展我们需要的功能$.extend({ min: func...
    99+
    2024-04-02
  • 如何实现C#扩展方法
    这篇文章将为大家详细讲解有关如何实现C#扩展方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在我们的编程生涯中我们要使用很多很多类库,这些类库有的是我们自己开发的,我们有她的代码,有的是第三方发布的,我...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作