rar自解压格式如何不让人解压

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rar自解压格式如何不让人解压相关的知识,希望对你有一定的参考价值。

二楼的 能不能看好标题 在说话什么乱七八爪的

1.先将需要安装的文件夹先压缩成RAR格式。

2.用WinRAR打开这个文件,然后点击窗口上方的“自解压格式”按钮(如果没有,在工具栏上点击右键->选择按钮,将“自解压格式”选中)。

3.在弹出的窗口中选择“Default.SFX”模块,然后单击下面的按钮“高级自解压选项”,这就是自解压高级设置。

4.第一步:“常规”选项卡:设置安装路径和运行程序,设置要解压文件的默认目标路径。

设置安装路径时你可以根据需要将它创建在用户的“Program Files”文件夹,当前文件夹,或指定一个绝对路径。前两种情况不需要包含驱动器号或前缀的“\”字符,而第三个则必须要有,在这里我们假如要安装到“Program Files”文件夹。

如果要在安装时运行程序,则要在解压前/后运行输入文件地址。解压前运行在开始解压之前,自解压程序会运行指定的程序,在运行程序前,目标目录会被设为当前文件夹。例如,当安装新版要覆盖旧版程序时,要删除旧版程序的时候,你便可以指定该命令。解压后运行自解压程序在成功解压之后,将试着运行指定的程序。含有解压文件的文件夹,在运行程序之前会被设为当前文件夹。

5.第二步:“高级”选项卡:设置安装时需要删除的文件和创建的快捷方式。

删除文件在解压前,自解压程序会删除所指定的文件或在目标文件夹内的文件。可以在此输入多个文件,文件名之间以空格分隔。如果在此指定的文件被使用而无法删除,自解压程序在解压前会试着将它临时重命名,并在 Windows 重新启动时删除它。

创建快捷方式,点击“添加快捷方式”按钮来增加一个新的快捷方式。

6.第三步:“模式”选项卡:设置安装模式。

临时模式:强制自解压程序创建一个临时文件夹,然后将所有文件解压缩到这个文件夹中,开始运行在上面讲过的“安装后运行”中所指定的程序,并在安装程序完成后删除临时文件夹中的所有内容。当运行这些操作时,自解压程序会自动设置为下面讲的安静模式。如果设置“解包到临时文件夹”,你也可同时指定安装程序不使用解压路径。

安静模式:默认自解压在开始解压缩前会先询问确认,并允许用户更改目标文件夹。如果你设置“安静模式”的“隐藏启动时的对话框”,这时会跳过确认画面。如果你也希望隐藏解压缩过程的话,请选择“全部隐藏”。

覆盖模式:选择让自解压程序怎样操作已存在的文件:覆盖之前询问、覆盖所有文件和跳过已经存在的文件。

7.第四步:“文本和图标”选项卡:设置自解压窗口的标题、自解压文本输出窗口中的文本或html网页和自解压文件的图标。

窗口标题、输出窗口文本不需要说了,如果要显示网页,点击下面“从文件加载文本”。自解压文件图标是ico文件,如果不指定,安装程序图标为默认图标。

8.第五步:“许可”选项卡:设置许可窗口标题和文本。

全部设置好后,按“确定”按钮,然后在点“确定”,生成一个exe自解压文件。一个安装程序就制作好了。看看,怎么样?其实不止WinRAR,其它软件也有一些很实用的功能,只要我们使用软件的时候处处稍微留心一下,就会发现许多的实用的功能。
参考技术A 这个做不到。你要是想打包软件的话,可以用NSIS或者Inno Setup。 参考技术B 压缩的时候在第二个还是第三个标签里,加密码

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 对象。接下来,就是这个对象的一些操作。

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

各自媒体平台均可搜索【硬核项目经理】

以上是关于rar自解压格式如何不让人解压的主要内容,如果未能解决你的问题,请参考以下文章

RAR软件支持解压7z格式吗

如何解压rar、 zip格式的压缩文件?

怎么把压缩文件rar格式转化成csv格式?

ZIP格式的文件下载后怎么解压?

LINUX怎么解压rar格式的文件,还有怎么安装软件

ZIP格式的文件怎么解压?