⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zip.lib.php

📁 我的一个网友写的PHP下面的zip类 最适合PHP做网上办公系统和提供网站管理程序。
💻 PHP
📖 第 1 页 / 共 2 页
字号:
        $header['stored_filename'] = $header['filename'];
        if (substr($header['filename'], -1) == '/')
            $header['external'] = 0x41FF0010;
        else $header['external'] = 0x0;
        
        $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;
        else $header['external'] = 0x0;
        return $header;
    }

    function ReadCentralDir($zip,$zip_name)
    {
        $size = filesize($zip_name);
        if ($size < 277) $maximum_size = $size;
        else $maximum_size=277;

        @fseek($zip, $size-$maximum_size);
        $pos = ftell($zip); $bytes = 0x00000000;

        while ($pos < $size)
        {
            $byte = @fread($zip, 1); $bytes=($bytes << 8) | Ord($byte);
            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']));
        $sAllPathName = $to;
        for($i=0;isset($pth[$i]);$i++)
        {
            if(!$pth[$i]) continue;
            $sAllPathName .= $pth[$i]."/";
            if(!is_dir($sAllPathName)) @mkdir($sAllPathName,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 < 2048 ? $size : 2048);
                    $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 < 1024 ? $size : 1024);
                    $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("Can not open the archive file!");
                if(!$gzp) return(-2);
                $fp = @fopen($to.$header['filename'],'wb');
                if(!$fp) return(-1);
                $size = $header['size'];

                while ($size != 0)
                {
                    $read_size = ($size < 2048 ? $size : 2048);
                    $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;
    }
    
    //增加文件
    function AddFile($sFileName, $compact = 1)
    {
        if (!file_exists($sFileName)) return false;
        else
        {
            $fd = fopen ($sFileName, "rb");
            $contents = fread ($fd, filesize($sFileName));
            fclose ($fd);
        }
        //echo $sFileName;
        $aFiles = Array(Array(basename($sFileName),$contents));
        return $this->Add($aFiles,$compact); 
    }
    //增加一个目录下的所有文件和子目录
    function AddDir($sRootDir,$compact = 1,$sSubDir="")
    {
        if ((substr($sRootDir,-1) != "/") && (substr($sRootDir,-1) != "\\")) $sRootDir .= "/";
        if (($sSubDir != "") && (substr($sSubDir,-1) != "/") && (substr($sSubDir,-1) != "\\")) $sSubDir .= "/";
        
        $handle = @opendir($sRootDir . $sSubDir);
        while ($tName = readdir($handle))
        {
            if (($tName == ".") ||($tName == "..")) continue;
            if (is_dir($sRootDir . $sSubDir . $tName)) $this->AddDir($sRootDir,$compact, $sSubDir . $tName . "/");
            else
            {
                $fd = fopen ($sRootDir . $sSubDir . $tName, "rb");
                $contents = fread ($fd, filesize($sRootDir . $sSubDir . $tName));
                fclose ($fd);
                $aFiles = Array(Array($sSubDir . $tName,$contents));
                $this->Add($aFiles,$compact);
            }
        }
        closedir($handle);
    }    
}
/*
    增加一个文件
    $z = new Zip;
    $z->AddFile("the/file.name",1);

    增加一个目录
    $z = new Zip;
    $z->AddDir("the/dir/name",1);

    解压缩
    $z = new Zip;
    $z->Extract("styles.zip","testzip");
*/
?>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -