verseles / sevenzip
一个使用 7zip 压缩和解压缩文件的软件包
Requires
- php: >=8.2
- symfony/process: ^7.0
Requires (Dev)
- phpunit/phpunit: ^11.1
README
一个使用 7zip CLI 压缩和解压缩文件的 PHP 软件包。
安装
通过 Composer 安装此软件包
composer require verseles/sevenzip️给项目加星标以帮助我们吸引更多开发者!️
使用方法
压缩
压缩文件或目录
$sevenZip = new SevenZip(); $sevenZip->format('7z') ->source('/path/to/source/file/or/directory') ->target('/path/to/archive.7z') ->compress();
压缩选项
- 格式:您可以使用
format()
方法设置压缩格式。常见的格式包括7z
、zip
、tar
、lz4
、lz5
、bzip2
和zstd
。您的操作系统需要支持所选格式。 - 压缩级别:您可以使用
faster()
、slower()
、mx()
和ultra()
方法调整压缩级别。 - 自定义标志:您可以使用
addFlag()
方法添加自定义压缩标志。 - 进度回调:您可以使用
progress()
方法设置进度回调以监视压缩进度。 - 在压缩前创建 tar 归档:您可以使用
tarBefore()
方法启用在压缩前创建 tar 归档的选项。这对于保留文件权限和属性很有用。
警告
格式支持取决于您的系统、架构等。您始终可以使用 format()
方法设置自定义格式。
任何以
tar.
开头的format()
设置将自动启用tarBefore()
。要禁用,请添加->forceTarBefore(false)
解压缩
解压缩存档
$sevenZip = new SevenZip(); $sevenZip->source('/path/to/archive.7z') ->target('/path/to/extract/directory') ->extract();
如果解压缩的文件是单个 tar 存档,它将被解压缩并删除 tar 文件。要避免此行为,请添加
->autoUntar(false)
加密
您可以使用密码加密压缩存档
$sevenZip = new SevenZip(); $sevenZip->source('/path/to/source/file/or/directory') ->target('/path/to/encrypted_archive.7z') ->encrypt('your_password') ->compress();
默认情况下,文件名也会被加密(在 zip 格式下不可能)。如果您想禁用文件名加密,请使用 notEncryptNames()
方法
$sevenZip->notEncryptNames();
对于 ZIP 存档,您可以使用 setZipEncryptionMethod()
方法指定加密方法。可用选项为 'ZipCrypto'(不安全)、' AES128'、'AES192' 或 'AES256'。默认为 'AES256'。
$sevenZip->setZipEncryptionMethod('AES256');
解密
在解压缩时解密加密的存档
$sevenZip = new SevenZip(); $sevenZip->source('/path/to/encrypted_archive.7z') ->target('/path/to/extract/directory') ->decrypt('your_password') ->extract();
包括和排除文件
SevenZip 允许您在压缩或解压缩存档时包括或排除特定文件。
包括文件
要包括存档中的特定文件,请使用 include
方法
$sevenZip->include('*.avg')->compress();
排除文件
要排除存档中的特定文件,请使用 exclude
方法
$sevenZip->exclude(['*.md', '*.pdf'])->compress();
请注意,您可以使用 include
和 exclude
方法同时使用以微调存档中包含的文件。
您可以将单个文件模式、文件模式数组或包含模式的 txt 文件路径传递给
exclude
和include
方法。
检查格式支持
您可以使用 checkSupport 方法检查当前 7-Zip 安装是否支持特定格式或多个格式。
$sevenZip = new SevenZip(); // Check if a single format is supported if ($sevenZip->checkSupport('zip')) { echo "ZIP format is supported."; } else { echo "ZIP format is not supported."; } // Check if multiple formats are supported if ($sevenZip->checkSupport(['zip', 'tar', '7z'])) { echo "ZIP, TAR, and 7Z formats are supported."; } else { echo "One or more formats are not supported."; }
TODO / WIP
- 完全支持添加标志(7z 开关)
- 通过使用 tar 标志添加对 gz、xz 等的自定义支持
- 使用 tar 保留原始文件权限和其他属性
- 在提取时自动解压 tar
- 按模式筛选文件
- 加密和解密
- 使用 7z 测试命令测试文件
- 检测操作系统支持的格式
- 为mac和linux添加内置的二进制文件
-
使用Docker进行PHPUnit测试使用内置二进制文件时不需要 - 使用本机zstd、brotli和其他格式作为后备
贡献
欢迎贡献!如果您想为此项目做出贡献,请按照以下步骤操作
- 分叉仓库
- 为您的功能或错误修复创建一个新的分支
- 进行您的更改,并使用描述性提交信息提交它们
- 将您的更改推送到您分叉的仓库
- 向主仓库提交拉取请求
请确保您的代码遵循项目的编码风格和约定。同时,为您的更改包括适当的测试。
测试
要运行测试,执行以下命令
composer test
文档/ API
以下是README中的文档/ API部分,已更新缺失的公开方法和按字母顺序排序
文档/ API
addFlag(string $flag, $value = null): static
添加压缩标志。
参数
$flag
: 要添加的压缩标志。$value
(可选): 标志的值。
返回: 七Zip类的当前实例。
示例
$sevenZip->addFlag('mfb', 64);
checkSupport(string|array $extensions): bool
检查给定的扩展名是否由当前7-Zip安装支持。
参数
$extensions
: 要检查的扩展名或扩展名数组。
返回: 如果所有给定的扩展名都受支持,则返回true,否则返回false。
示例
$sevenZip = new SevenZip(); // Check if a single format is supported $isZipSupported = $sevenZip->checkSupport('zip'); // Check if multiple formats are supported $areFormatsSupported = $sevenZip->checkSupport(['zip', 'tar', '7z']);
compress(): string
压缩文件或目录。
返回: 成功时的命令输出。
抛出
InvalidArgumentException
: 如果目标路径或源路径未设置。
示例
$sevenZip->compress();
copy(): static
根据指定的格式配置不压缩(仅复制)设置。
返回: 用于方法链的当前实例。
decrypt(string $password): self
使用提供的密码解密数据。
参数
$password
: 解密数据的密码。
返回: 此类的当前实例。
encrypt(string $password): self
使用提供的密码加密数据。
参数
$password
: 加密数据的密码。
返回: 此类的当前实例。
extract(): string
解压存档。
返回: 成功时的命令输出。
抛出
InvalidArgumentException
: 如果格式、存档路径或提取路径未设置。
示例
$sevenZip->extract();
faster(): static
将压缩级别设置为更快。
返回: 七Zip类的当前实例。
deleteSourceAfterExtract(bool $delete = true): self
设置是否在成功提取后删除源存档。
参数
$delete
: 在提取后是否删除源存档。默认为true
。
返回: 七Zip类的当前实例。
示例
$sevenZip->deleteSourceAfterExtract();
fileInfo(): string
检索有关指定存档文件的信息。
返回: 7-Zip命令的文件信息输出。
抛出
InvalidArgumentException
: 如果未设置存档路径。
示例
$info = $sevenZip->fileInfo();
fileList(): string
列出指定存档文件的内容。
返回: 7-Zip命令的文件列表输出。
抛出
InvalidArgumentException
: 如果未设置存档路径。
示例
$list = $sevenZip->fileList();
flagrize(array $flagsAndValues): array
将标志和值格式化为适合传递给7-Zip命令的字符串数组。
参数
$flagsAndValues
: 标志及其对应值的关联数组。如果值为null,则将标志添加而不带等号。
返回: 格式化后的标志字符串数组。
示例
$formattedFlags = $sevenZip->flagrize(['m0' => 'lzma2', 'mx' => 9]); // Output: ['-m0=lzma2', '-mx=9']
format(string $format): static
设置存档格式。
参数
$format
: 要使用的压缩格式。
返回: 七Zip类的当前实例。
示例
$sevenZip->format('7z');
getCustomFlags(): array
获取自定义压缩标志。
返回: 已添加的自定义压缩标志。
getEncryptNames(): ?bool
获取文件名是否加密。
返回: 文件名是否加密,或未设置时返回null。
getFormat(): string
获取存档格式。
返回: 要使用的压缩格式。
getInfo()
返回有关7-Zip、格式、编解码器和散列器的信息。
返回值:7-Zip 命令的输出。
getLastProgress(): int
获取最后报告的进度。
返回值:最后报告的进度百分比。
getPassword(): ?string
获取用于加密或解密的密码。
返回值:用于加密或解密的密码,如果未设置则返回 null。
getSevenZipPath(): ?string
获取 7-Zip 可执行文件路径。
返回值:7-Zip 可执行文件路径。
getSourcePath(): string
获取压缩/提取的源路径。
返回值:用于压缩或提取的源文件或目录路径。
getSupportedFormatExtensions(?array $formats = null): array
从给定的数组中获取所有支持的格式扩展名。
参数
$formats
(可选):格式数据数组。如果未提供,则使用 7-Zip 的内置信息。返回值:支持的格式扩展名数组。
示例
$sevenZip = new SevenZip(); $supportedFormats = $sevenZip->getSupportedFormatExtensions(); if (in_array('zip', $supportedFormats)) { echo "ZIP format is supported."; } else { echo "ZIP format is not supported."; }
getTargetPath(): string
获取压缩/提取的目标路径。
返回值:用于压缩或提取的目标文件或目录路径。
getZipEncryptionMethod(): string
获取 ZIP 归档使用的加密方法。
返回值:用于 ZIP 归档的加密方法。
exclude(string|array $patterns): self
根据提供的模式排除存档中的文件。
参数
$patterns
:单个文件模式、文件模式数组,或包含模式的 txt 文件路径。
返回: 七Zip类的当前实例。
示例
$sevenZip->exclude(['*.md', '*.pdf']);
include(string|array $patterns): self
根据提供的模式仅包含存档中指定的文件。
参数
$patterns
:单个文件模式、文件模式数组,或包含模式的 txt 文件路径。
返回: 七Zip类的当前实例。
示例
$sevenZip->include('*.avg');
info(): void
打印关于 7-Zip、格式、编解码器和散列器的信息。
md(string $size = '32m'): self
设置压缩算法的字典大小。
参数
$size
:字典大小。
返回: 七Zip类的当前实例。
mfb(int $bytes = 64): self
设置压缩算法的快速字节大小。
参数
$bytes
:快速字节大小。默认值(当设置)为 64。
返回: 七Zip类的当前实例。
mm(string $method): self
设置 ZIP 格式的压缩方法。
参数
$method
:要使用的压缩方法。可以是 'Copy'、'Deflate'、'Deflate64'、'BZip2'、'LZMA'、'PPMd'。
返回: 七Zip类的当前实例。
mmem(int|string $size = 24): static
设置压缩的内存限制。
参数
$size
:以兆字节为单位的内存限制或字符串(例如,'32m')。
返回: 七Zip类的当前实例。
示例
$sevenZip->mmem(32); // Set memory limit to 32 MB
mmt(int|bool|string $threads = 'on'): self
设置用于压缩的 CPU 线程数。
参数
$threads
:要使用的 CPU 线程数,或 'on' 或 'off'。
返回: 七Zip类的当前实例。
示例
$sevenZip->mmt('on'); // Use all available CPU threads $sevenZip->mmt(4); // Use 4 CPU threads
m0($method): self
设置压缩方法。
参数
$method
:要使用的压缩方法。
返回: 七Zip类的当前实例。
mpass(int $number = 7): self
设置压缩的遍历次数。
参数
$number
:压缩的遍历次数。
返回: 七Zip类的当前实例。
示例
$sevenZip->mpass(15); // Use 15 compression passes
ms(bool|string|int $on = true): self
启用或禁用固态压缩模式。
参数
$on
:启用或禁用固态压缩模式。可以是布尔值、'on' 或 'off'。
返回: 七Zip类的当前实例。
mx(int $level): static
使用 -mx
标志设置压缩级别。
参数
$level
:要使用的压缩级别。
返回: 七Zip类的当前实例。
示例
$sevenZip->mx(9); // Maximum compression
myx(int $level = 5): self
设置文件分析级别。
参数
$level
:文件分析级别。
返回: 七Zip类的当前实例。
notEncryptNames(): self
禁用文件名的加密。
返回: 七Zip类的当前实例。
progress(callable $callback): self
使用流畅接口设置进度回调。
参数
$callback
:在压缩过程中要调用的回调函数。
返回: 七Zip类的当前实例。
示例
$sevenZip->progress(function ($progress) { echo "Progress: {$progress}%\n"; });
removeFlag(string $flag): self
移除压缩标志。
参数
$flag
:要移除的压缩标志。
返回: 七Zip类的当前实例。
reset(): SevenZip
将属性值重置为其原始状态。
返回: 七Zip类的当前实例。
setCustomFlags(array $customFlags): SevenZip
设置自定义压缩标志。
参数
$customFlags
:要使用的自定义压缩标志。
返回: 七Zip类的当前实例。
示例
$sevenZip->setCustomFlags(['mx' => 9, 'mfb' => 64]);
setEncryptNames(bool $encryptNames): self
设置是否加密文件名。
参数
$encryptNames
:是否加密文件名。
返回: 七Zip类的当前实例。
setFormat(string $format): self
设置存档格式。
参数
$format
: 要使用的压缩格式。
返回: 七Zip类的当前实例。
示例
$sevenZip->setFormat('zip');
setPassword(?string $password): self
设置加密或解密密码。
参数
$password
:用于加密或解密的密码。
返回: 七Zip类的当前实例。
setProgressCallback(callable $callback): self
设置进度回调。
参数
$callback
:在压缩过程中要调用的回调函数。
返回: 七Zip类的当前实例。
setSevenZipPath(string $sevenZipPath): SevenZip
设置7-Zip可执行文件的路径。
参数
$sevenZipPath
:7-Zip可执行文件的路径。
返回: 七Zip类的当前实例。
setSourcePath(string $path): static
设置压缩/解压缩的源路径。
参数
$path
:用于压缩或解压缩的源文件或目录的路径。
返回: 七Zip类的当前实例。
示例
$sevenZip->setSourcePath('/path/to/source/file/or/directory');
setTargetPath(string $path): static
设置压缩/解压缩的目标路径。
参数
$path
:用于压缩或解压缩的目标文件或目录的路径。
返回: 七Zip类的当前实例。
示例
$sevenZip->setTargetPath('/path/to/archive.7z');
setZipEncryptionMethod(string $method): self
设置ZIP归档的加密方法。
参数
$method
:要使用的加密方法。可以是 'ZipCrypto'(不安全)、'AES128'、'AES192' 或 'AES256'。
返回: 七Zip类的当前实例。
slower(): static
将压缩级别设置为较慢。
返回: 七Zip类的当前实例。
source(string $path): self
设置压缩或解压缩操作的源路径。
参数
$path
:源路径。
返回: 七Zip类的当前实例。
target(?string $path): self
使用流畅接口设置压缩/解压缩操作的目标路径。
参数
$path
:用于压缩或解压缩的目标文件或目录的路径。
返回: 七Zip类的当前实例。
tarBefore(bool $keepFileInfo = true): self
启用在压缩前创建tar归档,默认情况下保留文件权限和属性。
参数
$keepFileInfo
(可选):创建tar归档时是否保留文件权限和属性。默认为true
。
返回: 七Zip类的当前实例。
示例
$sevenZip->tarBefore();
forceTarBefore(bool $force): self
设置是否在压缩前强制创建tar归档,无论格式如何。
参数
$force
:是否强制在压缩前创建tar归档。
返回: 七Zip类的当前实例。
示例
$sevenZip->forceTarBefore(true);
setTarKeepFileInfo(bool $keepFileInfo): self
设置在压缩前创建tar归档时是否保留文件权限和属性。
参数
$keepFileInfo
:是否保留文件权限和属性。
返回: 七Zip类的当前实例。
示例
$sevenZip->keepFileInfoOnTar(false);
shouldForceTarBefore(): bool
获取是否启用压缩前强制tar。
返回:是否启用压缩前强制tar。
isTarKeepFileInfo(): bool
获取在创建tar归档时是否启用保留文件权限和属性。
返回:是否启用保留文件权限和属性。
wasAlreadyTarred(): bool
检查源是否已被tar归档。
返回:源是否已被tar归档。
ultra(): self
根据指定的格式配置最大压缩设置。
返回: 用于方法链的当前实例。
许可协议
本软件包是开源软件,受MIT许可协议许可。
关于7zip二进制文件:大部分源代码受GNU LGPL许可协议保护。unRAR代码受GNU LGPL + unRAR限制的混合许可协议保护。有关详细信息,请查看许可协议。