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