php zip文件内容比较类,_PHP教程
php zip文件内容比较类,
一个php实现的zip文件内容比较类及其用法,可实现比较两个zip文件的内容,返回新增、删除、及相同的文件列表。
php实现的zip文件内容比较类。是一个非常实用的PHP类文件。
该php zip文件比较类主要实现比较两个zip文件的内容,返回新增,删除,及相同的文件列表。暂时只支持单层。
需求:上传一个zip文件,zip内有很多图片文件。需要对图片文件进行一系列很耗时的处理。当用户再更新zip文件时。判断zip内文件是否一致,只处理不同的文件。这样可以节省资源与时间,因此需要编写一个能够比较zip内文件的类。
ZipCompare.class.php类文件如下:
<?<span>php </span><span>/*</span><span>* Zip Compare class 比较两个zip文件的内容,返回新增,删除,及相同的文件列表,暂时只支持单层 * Date: 2014-05-18 * Author: fdipzone * Ver: 1.0 * www.jbxue.com * Func: * public compare 比较zip文件内容 * private getInfo 获取zip内文件列表 * private parse 分析两个zip的文件内容 * private check 检查zip文件是否正确 * private check_handler 检查服务器是否有安装unzip </span><span>*/</span> <span>class</span> ZipCompare{ <span>//</span><span> class start </span> <span>/*</span><span>* 比较zip文件内容,列出不相同的部分 * @param String $zipfile1 zip文件1 * @param String $zipfile2 zip文件2 * @return Array </span><span>*/</span> <span>public</span> <span>function</span> compare(<span>$zipfile1</span>, <span>$zipfile2</span><span>){ </span><span>//</span><span> 检查是否有安装unzip </span> <span>if</span>(!<span>$this</span>-><span>check_handler()){ </span><span>throw</span> <span>new</span> <span>Exception</span>('unzip not install'<span>); } </span><span>//</span><span> 检查zip文件 </span> <span>if</span>(!<span>$this</span>->check(<span>$zipfile1</span>) || !<span>$this</span>->check(<span>$zipfile2</span><span>)){ </span><span>throw</span> <span>new</span> <span>Exception</span>('zipfile not exists or error'<span>); } </span><span>//</span><span> 获取zip内文件列表 </span> <span>$zipinfo1</span> = <span>$this</span>->getInfo(<span>$zipfile1</span><span>); </span><span>$zipinfo2</span> = <span>$this</span>->getInfo(<span>$zipfile2</span><span>); </span><span>//</span><span> 分析两个zip的文件内容,返回相同及不同的文件列表 </span> <span>return</span> <span>$this</span>->parse(<span>$zipinfo1</span>, <span>$zipinfo2</span><span>); } </span><span>/*</span><span>* 获取zip内文件列表 * @param String $zipfile zip文件 * @return Array zip内文件列表 </span><span>*/</span> <span>private</span> <span>function</span> getInfo(<span>$zipfile</span><span>){ </span><span>//</span><span> unzip -v fields </span> <span>$fields</span> = <span>array</span>('Length','Method','Size','Cmpr','Date','Time','CRC-32','Name'<span>); </span><span>//</span><span> zip verbose </span> <span>$verbose</span> = <span>shell_exec</span>(<span>sprintf</span>("unzip -v %s | sed '\$d' | sed '\$d' | sed -n '4,\$p'", <span>$zipfile</span><span>)); </span><span>//</span><span> zip info </span> <span>$zipinfo</span> = <span>array</span><span>(); </span><span>$filelist</span> = <span>explode</span>("\n", <span>$verbose</span><span>); </span><span>if</span>(<span>$filelist</span><span>){ </span><span>foreach</span>(<span>$filelist</span> <span>as</span> <span>$rowdata</span><span>){ </span><span>if</span>(<span>$rowdata</span>==''<span>){ </span><span>continue</span><span>; } </span><span>$rowdata</span> = <span>preg_replace</span>('/[ ]{2,}/', ' ', <span>$rowdata</span>); <span>//</span><span> 将两个或以上空格替换为一个 </span> <span>$tmp</span> = <span>array_slice</span>(<span>explode</span>(' ', <span>$rowdata</span>), 1); <span>//</span><span> 去掉第一个空格 </span> <span>$file</span> = <span>array_combine</span>(<span>$fields</span>, <span>$tmp</span><span>); </span><span>$zipinfo</span>[<span>$file</span>['Name']] = <span>$file</span>['Length'].'_'.<span>$file</span>['CRC-32']; <span>//</span><span> 文件名,长度,CRC32,用于校验 </span> <span>} } </span><span>return</span> <span>$zipinfo</span><span>; } </span><span>/*</span><span>* 分析两个zip文件内容 * @param String $zipinfo1 * @param String $zipinfo2 * @return Array </span><span>*/</span> <span>private</span> <span>function</span> parse(<span>$zipinfo1</span>, <span>$zipinfo2</span><span>){ </span><span>$result</span> = <span>array</span><span>( </span>'add' => <span>array</span>(), <span>//</span><span> 新增 </span> 'del' => <span>array</span>(), <span>//</span><span> 缺少 </span> 'match' => <span>array</span>() <span>//</span><span> 匹配 </span> <span>); </span><span>if</span>(<span>$zipinfo1</span> && <span>$zipinfo2</span><span>){ </span><span>//</span><span> 在zip1但不在zip2的文件 </span> <span>$result</span>['add'] = <span>array_values</span>(<span>array_diff</span>(<span>array_keys</span>(<span>$zipinfo1</span>), <span>array_keys</span>(<span>$zipinfo2</span><span>))); </span><span>//</span><span> 在zip2但不在zip1的文件 </span> <span>$result</span>['del'] = <span>array_values</span>(<span>array_diff</span>(<span>array_keys</span>(<span>$zipinfo2</span>), <span>array_keys</span>(<span>$zipinfo1</span><span>))); </span><span>//</span><span> 同时在zip1与zip2的文件 </span> <span>$match_file</span> = <span>array_values</span>(<span>array_diff</span>(<span>array_keys</span>(<span>$zipinfo1</span>), <span>$result</span>['add'<span>])); </span><span>//</span><span> 检查相同文件名的文件内容是否匹配 </span> <span>for</span>(<span>$i</span>=0,<span>$len</span>=<span>count</span>(<span>$match_file</span>); <span>$i</span><<span>$len</span>; <span>$i</span>++<span>){ </span><span>if</span>(<span>$zipinfo1</span>[<span>$match_file</span>[<span>$i</span>]]==<span>$zipinfo2</span>[<span>$match_file</span>[<span>$i</span>]]){ <span>//</span><span> match </span> <span>array_push</span>(<span>$result</span>['match'], <span>$match_file</span>[<span>$i</span><span>]); }</span><span>else</span>{ <span>//</span><span> not match, change to add </span> <span>array_push</span>(<span>$result</span>['add'], <span>$match_file</span>[<span>$i</span><span>]); } } } </span><span>return</span> <span>$result</span><span>; } </span><span>/*</span><span>* 检查zip文件是否正确 * @param String $zipfile zip文件 * @return boolean </span><span>*/</span> <span>private</span> <span>function</span> check(<span>$zipfile</span><span>){ </span><span>//</span><span> 文件存在且能解压 </span> <span>return</span> <span>file_exists</span>(<span>$zipfile</span>) && <span>shell_exec</span>(<span>sprintf</span>('unzip -v %s | wc -l', <span>$zipfile</span>))>1<span>; } </span><span>/*</span><span>* 检查服务器是否有安装unzip * @return boolean </span><span>*/</span> <span>private</span> <span>function</span><span> check_handler(){ </span><span>return</span> <span>strstr</span>(<span>shell_exec</span>('unzip -v'), 'version')!=''<span>; } } </span><span>//</span><span> class end </span> ?>
demo示例程序如下:
<?<span>php </span><span>require</span> "ZipCompare.class.php"<span>; </span><span>$obj</span> = <span>new</span><span> ZipCompare(); </span><span>$result</span> = <span>$obj</span>->compare('test1.zip','test2.zip'<span>); </span><span>print_r</span>(<span>$result</span><span>); </span>?>
执行后输出:
Array
(
[add] => Array
(
[0] => 9.jpg
)
[del] => Array
(
[0] => 5.jpg
[1] => 6.jpg
[2] => 7.jpg
[3] => 8.jpg
)
[match] => Array
(
[0] => 1.jpg
[1] => 10.jpg
[2] => 11.jpg
[3] => 12.jpg
[4] => 13.jpg
[5] => 14.jpg
[6] => 15.jpg
[7] => 16.jpg
[8] => 17.jpg
[9] => 18.jpg
[10] => 2.jpg
[11] => 3.jpg
[12] => 4.jpg
)
)

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

CakePHP는 PHP용 오픈 소스 프레임워크입니다. 이는 애플리케이션을 훨씬 쉽게 개발, 배포 및 유지 관리할 수 있도록 하기 위한 것입니다. CakePHP는 강력하고 이해하기 쉬운 MVC와 유사한 아키텍처를 기반으로 합니다. 모델, 뷰 및 컨트롤러 gu

CakePHP에 로그인하는 것은 매우 쉬운 작업입니다. 한 가지 기능만 사용하면 됩니다. cronjob과 같은 백그라운드 프로세스에 대해 오류, 예외, 사용자 활동, 사용자가 취한 조치를 기록할 수 있습니다. CakePHP에 데이터를 기록하는 것은 쉽습니다. log() 함수는 다음과 같습니다.

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는

CakePHP는 오픈 소스 MVC 프레임워크입니다. 이를 통해 애플리케이션 개발, 배포 및 유지 관리가 훨씬 쉬워집니다. CakePHP에는 가장 일반적인 작업의 과부하를 줄이기 위한 여러 라이브러리가 있습니다.
