verseles/sevenzip

一个使用 7zip 压缩和解压缩文件的软件包

v2.0.0 2024-05-20 19:38 UTC

This package is auto-updated.

Last update: 2024-09-20 20:36:38 UTC


README

一个使用 7zip CLI 压缩和解压缩文件的 PHP 软件包。

GitHub Actions Workflow Status

安装

通过 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() 方法设置压缩格式。常见的格式包括 7zziptarlz4lz5bzip2zstd。您的操作系统需要支持所选格式。
  • 压缩级别:您可以使用 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();

请注意,您可以使用 includeexclude 方法同时使用以微调存档中包含的文件。

您可以将单个文件模式、文件模式数组或包含模式的 txt 文件路径传递给 excludeinclude 方法。

检查格式支持

您可以使用 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和其他格式作为后备

贡献

欢迎贡献!如果您想为此项目做出贡献,请按照以下步骤操作

  1. 分叉仓库
  2. 为您的功能或错误修复创建一个新的分支
  3. 进行您的更改,并使用描述性提交信息提交它们
  4. 将您的更改推送到您分叉的仓库
  5. 向主仓库提交拉取请求

请确保您的代码遵循项目的编码风格和约定。同时,为您的更改包括适当的测试。

测试

要运行测试,执行以下命令

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限制的混合许可协议保护。有关详细信息,请查看许可协议