压缩
/**
* @description: 压缩指定目录或指定文件
* @param string $dir 要压缩的目录,默认为当前目录
* @param array $files 要压缩的文件数组,[['name'=>'','path'=>'']]$files指定时,$dir参数不生效
* @param string $gen_dir 生成压缩包位置,默认当前位置
* @param string $name 压缩后的文件名,默认自动生成
* @return bool
*/
function compress($dir = './', $files = [], $gen_dir = './', $name = null)
{
!is_dir($gen_dir) && mkdir(iconv('utf-8', 'gbk', $gen_dir), 0777, true);
$gzname = str_replace('\\', '/', realpath($gen_dir)) . '/' . ($name ?: (time() . bin2hex(random_bytes(8)))) . '.tar';
@unlink($gzname);
@unlink($gzname . '.gz');
$tar = new PharData($gzname);
if ($files) {
foreach ($files as $file) {
$tar[$file['name']] = file_get_contents($file['path']);
}
} else {
$tar->buildFromDirectory($dir);
}
$tar->compress(Phar::GZ);
@unlink($gzname);
return $gzname . '.gz';
}
$file = [
['name'=>'11.txt','path'=>'C:\Users\Administrator\Desktop\中文\1.txt'],
['name'=>'22.txt','path'=>'C:\Users\Administrator\Desktop\中文\2.txt'],
['name'=>'33.txt','path'=>'C:\Users\Administrator\Desktop\中文\3.txt'],
];
compress('C:\Users\Administrator\Desktop\中文', $file, 'C:\Users\Administrator\Desktop\中文1', '是什么啊');
解压缩
/**
* @description: 解压缩文件,压缩文件中的文件会覆盖解压目录的文件
* @param string $filename 要解压的文件
* @param string $dir 解压的位置,默认文件所在位置
* @return bool
*/
function uncompress($filename, $dir = '')
{
!$dir && $dir = pathinfo($filename, PATHINFO_DIRNAME);
!is_dir($dir) && mkdir(iconv('utf-8', 'gbk', $dir), 0777, true);
$dir = str_replace('\\', '/', $dir) . '/';
$tar = new PharData($filename);
$tar->decompress();
// true解压时会覆盖现有文件
$tar->extractTo($dir, null, true);
@unlink(rtrim($filename, '.gz'));
}
uncompress('C:\Users\Administrator\Desktop\中文1\是什么.tar.gz');