真正的ZIP文件操作類(lèi)php
Jul 29, 2016 am 08:37 AM/********************
作者未知
整理:?Longbill?(?www.longbill.cn?;?longbill.cn@gmail.com?)
*********************/
class?zip?
{
?var?$datasec,?$ctrl_dir?=?array();
?var?$eof_ctrl_dir?=?"\x50\x4b\x05\x06\x00\x00\x00\x00";
?var?$old_offset?=?0;?var?$dirs?=?Array(".");
?function?get_List($zip_name)
?{
???$zip?=?@fopen($zip_name,?'rb');
???if(!$zip)?return(0);
???$centd?=?$this->ReadCentralDir($zip,$zip_name);
????@rewind($zip);
????@fseek($zip,?$centd['offset']);
???for?($i=0;?$i???{
????$header?=?$this->ReadCentralFileHeaders($zip);
????$header['index']?=?$i;$info['filename']?=?$header['filename'];
????$info['stored_filename']?=?$header['stored_filename'];
????$info['size']?=?$header['size'];$info['compressed_size']=$header['compressed_size'];
????$info['crc']?=?strtoupper(dechex(?$header['crc']?));
????$info['mtime']?=?$header['mtime'];?$info['comment']?=?$header['comment'];
????$info['folder']?=?($header['external']==0x41FF0010||$header['external']==16)?1:0;
????$info['index']?=?$header['index'];$info['status']?=?$header['status'];
????$ret[]=$info;?unset($header);
???}
??return?$ret;
?}
?function?Add($files,$compact)
?{
??if(!is_array($files[0]))?$files=Array($files);
??for($i=0;$files[$i];$i++){
????$fn?=?$files[$i];
????if(!in_Array(dirname($fn[0]),$this->dirs))
?????$this->add_Dir(dirname($fn[0]));
????if(basename($fn[0]))
?????$ret[basename($fn[0])]=$this->add_File($fn[1],$fn[0],$compact);
??}
??return?$ret;
?}
?function?get_file()
?{
???$data?=?implode('',?$this?->?datasec);
???$ctrldir?=?implode('',?$this?->?ctrl_dir);
???return?$data?.?$ctrldir?.?$this?->?eof_ctrl_dir?.
????pack('v',?sizeof($this?->?ctrl_dir)).pack('v',?sizeof($this?->?ctrl_dir)).
????pack('V',?strlen($ctrldir))?.?pack('V',?strlen($data))?.?"\x00\x00";
?}
?function?add_dir($name)?
?{?
???$name?=?str_replace("\\",?"/",?$name);?
???$fr?=?"\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00";?
???$fr?.=?pack("V",0).pack("V",0).pack("V",0).pack("v",?strlen($name)?);?
???$fr?.=?pack("v",?0?).$name.pack("V",?0).pack("V",?0).pack("V",?0);?
???$this?->?datasec[]?=?$fr;
???$new_offset?=?strlen(implode("",?$this->datasec));?
???$cdrec?=?"\x50\x4b\x01\x02\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00";?
???$cdrec?.=?pack("V",0).pack("V",0).pack("V",0).pack("v",?strlen($name)?);?
???$cdrec?.=?pack("v",?0?).pack("v",?0?).pack("v",?0?).pack("v",?0?);?
???$ext?=?"\xff\xff\xff\xff";?
???$cdrec?.=?pack("V",?16?).pack("V",?$this?->?old_offset?).$name;?
???$this?->?ctrl_dir[]?=?$cdrec;?
???$this?->?old_offset?=?$new_offset;?
???$this?->?dirs[]?=?$name;
?}
?function?add_File($data,?$name,?$compact?=?1)
?{
???$name?????=?str_replace('\\',?'/',?$name);
???$dtime????=?dechex($this->DosTime());
???$hexdtime?=?'\x'?.?$dtime[6]?.?$dtime[7].'\x'.$dtime[4]?.?$dtime[5]
?????.?'\x'?.?$dtime[2]?.?$dtime[3].'\x'.$dtime[0].$dtime[1];
???eval('$hexdtime?=?"'?.?$hexdtime?.?'";');
???if($compact)
???$fr?=?"\x50\x4b\x03\x04\x14\x00\x00\x00\x08\x00".$hexdtime;
???else?$fr?=?"\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00".$hexdtime;
???$unc_len?=?strlen($data);?$crc?=?crc32($data);
???if($compact){
?????$zdata?=?gzcompress($data);?$c_len?=?strlen($zdata);
?????$zdata?=?substr(substr($zdata,?0,?strlen($zdata)?-?4),?2);
???}else{
?????$zdata?=?$data;
???}
???$c_len=strlen($zdata);
???$fr?.=?pack('V',?$crc).pack('V',?$c_len).pack('V',?$unc_len);
???$fr?.=?pack('v',?strlen($name)).pack('v',?0).$name.$zdata;
???$fr?.=?pack('V',?$crc).pack('V',?$c_len).pack('V',?$unc_len);
???$this?->?datasec[]?=?$fr;
???$new_offset????????=?strlen(implode('',?$this->datasec));
???if($compact)
????????$cdrec?=?"\x50\x4b\x01\x02\x00\x00\x14\x00\x00\x00\x08\x00";
???else?$cdrec?=?"\x50\x4b\x01\x02\x14\x00\x0a\x00\x00\x00\x00\x00";
???$cdrec?.=?$hexdtime.pack('V',?$crc).pack('V',?$c_len).pack('V',?$unc_len);
???$cdrec?.=?pack('v',?strlen($name)?).pack('v',?0?).pack('v',?0?);
???$cdrec?.=?pack('v',?0?).pack('v',?0?).pack('V',?32?);
???$cdrec?.=?pack('V',?$this?->?old_offset?);
???$this?->?old_offset?=?$new_offset;
???$cdrec?.=?$name;
???$this?->?ctrl_dir[]?=?$cdrec;
???return?true;
?}
?function?DosTime()?{
???$timearray?=?getdate();
???if?($timearray['year']??????$timearray['year']?=?1980;?$timearray['mon']?=?1;
?????$timearray['mday']?=?1;?$timearray['hours']?=?0;
?????$timearray['minutes']?=?0;?$timearray['seconds']?=?0;
???}
???return?(($timearray['year']?-?1980)?????($timearray['minutes']?>?1);
?}
?function?Extract?(?$zn,?$to,?$index?=?Array(-1)?)
?{
???$ok?=?0;?$zip?=?@fopen($zn,'rb');
???if(!$zip)?return(-1);
???$cdir?=?$this->ReadCentralDir($zip,$zn);
???$pos_entry?=?$cdir['offset'];
???if(!is_array($index)){?$index?=?array($index);??}
???for($i=0;?$index[$i];$i++){
?????if(intval($index[$i])!=$index[$i]||$index[$i]>$cdir['entries'])
??????return(-1);
???}
???for?($i=0;?$i???{
?????@fseek($zip,?$pos_entry);
?????$header?=?$this->ReadCentralFileHeaders($zip);
?????$header['index']?=?$i;?$pos_entry?=?ftell($zip);
?????@rewind($zip);?fseek($zip,?$header['offset']);
?????if(in_array("-1",$index)||in_array($i,$index))
??????$stat[$header['filename']]=$this->ExtractFile($header,?$to,?$zip);
???}
???fclose($zip);
???return?$stat;
?}
??function?ReadFileHeader($zip)
??{?
????$binary_data?=?fread($zip,?30);
????$data?=?unpack('vchk/vid/vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len',?$binary_data);
????$header['filename']?=?fread($zip,?$data['filename_len']);
????if?($data['extra_len']?!=?0)?{
??????$header['extra']?=?fread($zip,?$data['extra_len']);
????}?else?{?$header['extra']?=?'';?}
????$header['compression']?=?$data['compression'];$header['size']?=?$data['size'];
????$header['compressed_size']?=?$data['compressed_size'];
????$header['crc']?=?$data['crc'];?$header['flag']?=?$data['flag'];
????$header['mdate']?=?$data['mdate'];$header['mtime']?=?$data['mtime'];
????if?($header['mdate']?&&?$header['mtime']){
?????$hour=($header['mtime']&0xF800)>>11;$minute=($header['mtime']&0x07E0)>>5;
?????$sec
?????$m
?????$header['mtime']?=?mktime($hour,?$minute,?$seconde,?$month,?$day,?$year);
????}else{$header['mtime']?=?time();}
????$header['stored_filename']?=?$header['filename'];
????$header['status']?=?"ok";
????return?$header;
??}
?function?ReadCentralFileHeaders($zip){
????$binary_data?=?fread($zip,?46);
????$header?=?unpack('vchkid/vid/vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset',?$binary_data);
????if?($header['filename_len']?!=?0)
??????$header['filename']?=?fread($zip,$header['filename_len']);
????else?$header['filename']?=?'';
????if?($header['extra_len']?!=?0)
??????$header['extra']?=?fread($zip,?$header['extra_len']);
????else?$header['extra']?=?'';
????if?($header['comment_len']?!=?0)
??????$header['comment']?=?fread($zip,?$header['comment_len']);
????else?$header['comment']?=?'';
????if?($header['mdate']?&&?$header['mtime'])
????{
??????$hour?=?($header['mtime']?&?0xF800)?>>?11;
??????$minute?=?($header['mtime']?&?0x07E0)?>>?5;
??????$seconde?=?($header['mtime']?&?0x001F)*2;
??????$year?=?(($header['mdate']?&?0xFE00)?>>?9)?+?1980;
??????$month?=?($header['mdate']?&?0x01E0)?>>?5;
??????$day?=?$header['mdate']?&?0x001F;
??????$header['mtime']?=?mktime($hour,?$minute,?$seconde,?$month,?$day,?$year);
????}?else?{
??????$header['mtime']?=?time();
????}
????$header['stored_filename']?=?$header['filename'];
????$header['status']?=?'ok';
????if?(substr($header['filename'],?-1)?==?'/')
??????$header['external']?=?0x41FF0010;
????return?$header;
?}
?function?ReadCentralDir($zip,$zip_name)
?{
??$size?=?filesize($zip_name);
??if?($size???else?$maximum_size=277;
??@fseek($zip,?$size-$maximum_size);
??$pos?=?ftell($zip);?$bytes?=?0x00000000;
??while?($pos???{
????$byte?=?@fread($zip,?1);?$bytes=($bytes?????if?($bytes?==?0x504b0506){?$pos++;?break;?}?$pos++;
??}
?$data=unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size',fread($zip,18));
??if?($data['comment_size']?!=?0)
????$centd['comment']?=?fread($zip,?$data['comment_size']);
????else?$centd['comment']?=?'';?$centd['entries']?=?$data['entries'];
??$centd['disk_entries']?=?$data['disk_entries'];
??$centd['offset']?=?$data['offset'];$centd['disk_start']?=?$data['disk_start'];
??$centd['size']?=?$data['size'];??$centd['disk']?=?$data['disk'];
??return?$centd;
?}
?function?ExtractFile($header,$to,$zip)
?{
???$header?=?$this->readfileheader($zip);
???if(substr($to,-1)!="/")?$to.="/";
???if(!@is_dir($to))?@mkdir($to,0777);
???$pth?=?explode("/",dirname($header['filename']));
???for($i=0;isset($pth[$i]);$i++){
?????if(!$pth[$i])?continue;$pthss.=$pth[$i]."/";
?????if(!is_dir($to.$pthss))?@mkdir($to.$pthss,0777);
???}
??if?(!($header['external']==0x41FF0010)&&!($header['external']==16))
??{
???if?($header['compression']==0)
???{
????$fp?=?@fopen($to.$header['filename'],?'wb');
????if(!$fp)?return(-1);
????$size?=?$header['compressed_size'];
????while?($size?!=?0)
????{
??????$read_size?=?($size???????$buffer?=?fread($zip,?$read_size);
??????$binary_data?=?pack('a'.$read_size,?$buffer);
??????@fwrite($fp,?$binary_data,?$read_size);
??????$size?-=?$read_size;
????}
????fclose($fp);
????touch($to.$header['filename'],?$header['mtime']);
??}else{
???$fp?=?@fopen($to.$header['filename'].'.gz','wb');
???if(!$fp)?return(-1);
???$binary_data?=?pack('va1a1Va1a1',?0x8b1f,?Chr($header['compression']),
?????Chr(0x00),?time(),?Chr(0x00),?Chr(3));
???fwrite($fp,?$binary_data,?10);
???$size?=?$header['compressed_size'];
???while?($size?!=?0)
???{
?????$read_size?=?($size??????$buffer?=?fread($zip,?$read_size);
?????$binary_data?=?pack('a'.$read_size,?$buffer);
?????@fwrite($fp,?$binary_data,?$read_size);
?????$size?-=?$read_size;
???}
???$binary_data?=?pack('VV',?$header['crc'],?$header['size']);
???fwrite($fp,?$binary_data,8);?fclose($fp);
???$gzp?=?@gzopen($to.$header['filename'].'.gz','rb')?or?die("Cette?archive?est?compress");
????if(!$gzp)?return(-2);
???$fp?=?@fopen($to.$header['filename'],'wb');
???if(!$fp)?return(-1);
???$size?=?$header['size'];
???while?($size?!=?0)
???{
?????$read_size?=?($size??????$buffer?=?gzread($gzp,?$read_size);
?????$binary_data?=?pack('a'.$read_size,?$buffer);
?????@fwrite($fp,?$binary_data,?$read_size);
?????$size?-=?$read_size;
???}
???fclose($fp);?gzclose($gzp);
???touch($to.$header['filename'],?$header['mtime']);
???@unlink($to.$header['filename'].'.gz');
??}}
??return?true;
?}
}
?>
打包文件下載
以上就介紹了 真正的ZIP文件操作類(lèi)php,包括了方面的內(nèi)容,希望對(duì)PHP教程有興趣的朋友有所幫助。

熱AI工具

Undress AI Tool
免費(fèi)脫衣服圖片

Undresser.AI Undress
人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover
用于從照片中去除衣服的在線人工智能工具。

Clothoff.io
AI脫衣機(jī)

Video Face Swap
使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱門(mén)文章

熱工具

記事本++7.3.1
好用且免費(fèi)的代碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
功能強(qiáng)大的PHP集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)代碼編輯軟件(SublimeText3)

Windows11將清新優(yōu)雅的設(shè)計(jì)帶到了最前沿;現(xiàn)代界面允許您個(gè)性化和更改最精細(xì)的細(xì)節(jié),例如窗口邊框。在本指南中,我們將討論分步說(shuō)明,以幫助您在Windows操作系統(tǒng)中創(chuàng)建反映您的風(fēng)格的環(huán)境。如何更改窗口邊框設(shè)置?按+打開(kāi)“設(shè)置”應(yīng)用。WindowsI轉(zhuǎn)到個(gè)性化,然后單擊顏色設(shè)置。顏色更改窗口邊框設(shè)置窗口11“寬度=”643“高度=”500“>找到在標(biāo)題欄和窗口邊框上顯示強(qiáng)調(diào)色選項(xiàng),然后切換它旁邊的開(kāi)關(guān)。若要在“開(kāi)始”菜單和任務(wù)欄上顯示主題色,請(qǐng)打開(kāi)“在開(kāi)始”菜單和任務(wù)欄上顯示主題

“你的組織要求你更改PIN消息”將顯示在登錄屏幕上。當(dāng)在使用基于組織的帳戶(hù)設(shè)置的電腦上達(dá)到PIN過(guò)期限制時(shí),就會(huì)發(fā)生這種情況,在該電腦上,他們可以控制個(gè)人設(shè)備。但是,如果您使用個(gè)人帳戶(hù)設(shè)置了Windows,則理想情況下不應(yīng)顯示錯(cuò)誤消息。雖然情況并非總是如此。大多數(shù)遇到錯(cuò)誤的用戶(hù)使用個(gè)人帳戶(hù)報(bào)告。為什么我的組織要求我在Windows11上更改我的PIN?可能是您的帳戶(hù)與組織相關(guān)聯(lián),您的主要方法應(yīng)該是驗(yàn)證這一點(diǎn)。聯(lián)系域管理員會(huì)有所幫助!此外,配置錯(cuò)誤的本地策略設(shè)置或不正確的注冊(cè)表項(xiàng)也可能導(dǎo)致錯(cuò)誤。即

默認(rèn)情況下,Windows11上的標(biāo)題欄顏色取決于您選擇的深色/淺色主題。但是,您可以將其更改為所需的任何顏色。在本指南中,我們將討論三種方法的分步說(shuō)明,以更改它并個(gè)性化您的桌面體驗(yàn),使其具有視覺(jué)吸引力。是否可以更改活動(dòng)和非活動(dòng)窗口的標(biāo)題欄顏色?是的,您可以使用“設(shè)置”應(yīng)用更改活動(dòng)窗口的標(biāo)題欄顏色,也可以使用注冊(cè)表編輯器更改非活動(dòng)窗口的標(biāo)題欄顏色。若要了解這些步驟,請(qǐng)轉(zhuǎn)到下一部分。如何在Windows11中更改標(biāo)題欄的顏色?1.使用“設(shè)置”應(yīng)用按+打開(kāi)設(shè)置窗口。WindowsI前往“個(gè)性化”,然

任務(wù)欄縮略圖可能很有趣,但它們也可能分散注意力或煩人??紤]到您將鼠標(biāo)懸停在該區(qū)域的頻率,您可能無(wú)意中關(guān)閉了重要窗口幾次。另一個(gè)缺點(diǎn)是它使用更多的系統(tǒng)資源,因此,如果您一直在尋找一種提高資源效率的方法,我們將向您展示如何禁用它。不過(guò),如果您的硬件規(guī)格可以處理它并且您喜歡預(yù)覽版,則可以啟用它。如何在Windows11中啟用任務(wù)欄縮略圖預(yù)覽?1.使用“設(shè)置”應(yīng)用點(diǎn)擊鍵并單擊設(shè)置。Windows單擊系統(tǒng),然后選擇關(guān)于。點(diǎn)擊高級(jí)系統(tǒng)設(shè)置。導(dǎo)航到“高級(jí)”選項(xiàng)卡,然后選擇“性能”下的“設(shè)置”。在“視覺(jué)效果”選

您是否在Windows安裝程序頁(yè)面上看到“出現(xiàn)問(wèn)題”以及“OOBELANGUAGE”語(yǔ)句?Windows的安裝有時(shí)會(huì)因此類(lèi)錯(cuò)誤而停止。OOBE表示開(kāi)箱即用的體驗(yàn)。正如錯(cuò)誤提示所表示的那樣,這是與OOBE語(yǔ)言選擇相關(guān)的問(wèn)題。沒(méi)有什么可擔(dān)心的,你可以通過(guò)OOBE屏幕本身的漂亮注冊(cè)表編輯來(lái)解決這個(gè)問(wèn)題??焖傩迯?fù)–1.單擊OOBE應(yīng)用底部的“重試”按鈕。這將繼續(xù)進(jìn)行該過(guò)程,而不會(huì)再打嗝。2.使用電源按鈕強(qiáng)制關(guān)閉系統(tǒng)。系統(tǒng)重新啟動(dòng)后,OOBE應(yīng)繼續(xù)。3.斷開(kāi)系統(tǒng)與互聯(lián)網(wǎng)的連接。在脫機(jī)模式下完成OOBE的所

屏幕亮度是使用現(xiàn)代計(jì)算設(shè)備不可或缺的一部分,尤其是當(dāng)您長(zhǎng)時(shí)間注視屏幕時(shí)。它可以幫助您減輕眼睛疲勞,提高易讀性,并輕松有效地查看內(nèi)容。但是,根據(jù)您的設(shè)置,有時(shí)很難管理亮度,尤其是在具有新UI更改的Windows11上。如果您在調(diào)整亮度時(shí)遇到問(wèn)題,以下是在Windows11上管理亮度的所有方法。如何在Windows11上更改亮度[10種方式解釋]單顯示器用戶(hù)可以使用以下方法在Windows11上調(diào)整亮度。這包括使用單個(gè)顯示器的臺(tái)式機(jī)系統(tǒng)以及筆記本電腦。讓我們開(kāi)始吧。方法1:使用操作中心操作中心是訪問(wèn)

在Windows11上的顯示縮放方面,我們都有不同的偏好。有些人喜歡大圖標(biāo),有些人喜歡小圖標(biāo)。但是,我們都同意擁有正確的縮放比例很重要。字體縮放不良或圖像過(guò)度縮放可能是工作時(shí)真正的生產(chǎn)力殺手,因此您需要知道如何對(duì)其進(jìn)行自定義以充分利用系統(tǒng)功能。自定義縮放的優(yōu)點(diǎn):對(duì)于難以閱讀屏幕上的文本的人來(lái)說(shuō),這是一個(gè)有用的功能。它可以幫助您一次在屏幕上查看更多內(nèi)容。您可以創(chuàng)建僅適用于某些監(jiān)視器和應(yīng)用程序的自定義擴(kuò)展配置文件??梢詭椭岣叩投擞布男阅堋K鼓梢愿玫乜刂破聊簧系膬?nèi)容。如何在Windows11

Windows上的激活過(guò)程有時(shí)會(huì)突然轉(zhuǎn)向顯示包含此錯(cuò)誤代碼0xc004f069的錯(cuò)誤消息。雖然激活過(guò)程已經(jīng)聯(lián)機(jī),但一些運(yùn)行WindowsServer的舊系統(tǒng)可能會(huì)遇到此問(wèn)題。通過(guò)這些初步檢查,如果這些檢查不能幫助您激活系統(tǒng),請(qǐng)?zhí)D(zhuǎn)到主要解決方案以解決問(wèn)題。解決方法–關(guān)閉錯(cuò)誤消息和激活窗口。然后,重新啟動(dòng)計(jì)算機(jī)。再次從頭開(kāi)始重試Windows激活過(guò)程。修復(fù)1–從終端激活從cmd終端激活WindowsServerEdition系統(tǒng)。階段–1檢查Windows服務(wù)器版本您必須檢查您使用的是哪種類(lèi)型的W
