gemorroj / archive7z
7z 命令行包装器
5.7.0
2023-12-22 13:40 UTC
Requires
- php: >=8.0.2
- symfony/process: ^5.4||^6.0||^7.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.41
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^9.6
README
功能
- 支持所有 7-zip 格式
- 打包/解包:
7z
,XZ
,BZIP2
,GZIP
,TAR
,ZIP
和WIM
. - 仅解包:
APFS
,AR
,ARJ
,Base64
,CAB
,CHM
,CPIO
,CramFS
,DMG
,EXT
,FAT
,GPT
,HFS
,IHEX
,ISO
,LZH
,LZMA
,MBR
,MSI
,NSIS
,NTFS
,QCOW2
,RAR
,RPM
,SquashFS
,UDF
,UEFI
,VDI
,VHD
,VHDX
,VMDK
,XAR
和Z
.
- 打包/解包:
- 列出文件和目录
- 从存档中获取任何文件的正文
- 删除文件或目录
- 添加文件或目录
要求
- PHP >= 8.0.2
- 允许 proc_open 函数
- 对于 Windows: 7-zip >= 7.30 (https://www.7-zip.org/)
- 对于 Linux/MacOs: 7-zip >= 21.01 或 p7zip >= 9.38 (https://github.com/p7zip-project/p7zip)
安装
composer require gemorroj/archive7z
注意事项
- https://sourceforge.net/p/p7zip/discussion/383043/thread/fa143cf2/
- 仅当文件名使用 UTF-8 编码时才能正确工作 #15.
建议
Archive7z 主要关注包装原始 7-zip 功能。但在您的应用程序中使用时并不总是方便。因此,我们建议您始终通过添加更高级的逻辑来在 Archive7z 上创建自己的包装类。
示例
<?php use Archive7z\Archive7z; class MyArchive7z extends Archive7z { protected $timeout = 120; protected $compressionLevel = 6; protected $overwriteMode = self::OVERWRITE_MODE_S; protected $outputDirectory = '/path/to/custom/output/directory'; } $obj = new MyArchive7z('path_to_7z_file.7z'); if (!$obj->isValid()) { throw new \RuntimeException('Incorrect archive'); } print_r($obj->getInfo()); /* Archive7z\Info Object ( [path:Archive7z\Info:private] => /full_path_to/test.7z [type:Archive7z\Info:private] => 7z [physicalSize:Archive7z\Info:private] => 165343 [headersSize:Archive7z\Info:private] => 241 [method:Archive7z\Info:private] => LZMA2:192k [solid:Archive7z\Info:private] => + [blocks:Archive7z\Info:private] => 1 [codePage:Archive7z\Info:private] => ) */ // $obj->setPassword('123'); // $obj->getEntries('test', 100) foreach ($obj->getEntries() as $entry) { print_r($entry); /* Archive7z\Entry Object ( [path:Archive7z\Entry:private] => 1.jpg [size:Archive7z\Entry:private] => 91216 [packedSize:Archive7z\Entry:private] => 165344 [modified:Archive7z\Entry:private] => 2013-06-10 09:56:07 [created:Archive7z\Entry:private] => [attributes:Archive7z\Entry:private] => A [crc:Archive7z\Entry:private] => 871345C2 [encrypted:Archive7z\Entry:private] => + [method:Archive7z\Entry:private] => LZMA:192k 7zAES:19 [block:Archive7z\Entry:private] => 0 [comment:Archive7z\Entry:private] => [hostOs:Archive7z\Entry:private] => [characteristics:Archive7z\Entry:private] => [folder:Archive7z\Entry:private] => [archive:Archive7z\Entry:private] => MyArchive7z Object ( [timeout:protected] => 60 [compressionLevel:protected] => 6 [overwriteMode:protected] => -aos [outputDirectory:protected] => /path/to/custom/output/directory [binary7z:Archive7z\Archive7z:private] => C:\Program Files\7-Zip\7z.exe [filename:Archive7z\Archive7z:private] => s:\VCS\Git\Archive7z\tests/fixtures/testPasswd.7z [password:Archive7z\Archive7z:private] => 123 [encryptFilenames:protected] => ) ) */ if ($entry->getPath() === 'test/test.txt') { $entry->extractTo('path_to_extract_folder/'); // extract the file } } echo $obj->getContent('test/test.txt'); // show content of the file $obj->setOutputDirectory('path_to_extract_folder/')->extract(); // extract the archive $obj->setOutputDirectory('path_to_extract_pass_folder/')->setPassword('pass')->extractEntry('test/test.txt'); // extract the password-protected entry $solidMode = new SolidMode(); $solidMode->setMode(SolidMode::OFF); $obj->setSolidMode($solidMode); $obj->addEntry(__DIR__); // add directory to the archive (include subfolders) $obj->addEntry(__FILE__); // add file to the archive $obj->renameEntry(__FILE__, __FILE__.'new'); // rename the file in the archive $obj->delEntry(__FILE__.'new'); // remove the file from the archive