其实压缩文件就是创建一个通过某种压缩技术生成的文件夹,然后将想要压缩的文件添加进去;
    而解压缩文件就是将这个压缩文件夹里的文件取出来,到指定的地方,而这个过程就是相当但是于将这个文件夹里的文件copy到指定地方;
而我们在压缩和解压缩的过程中难免少不了要处理含有中文名的文件,在压缩文件的时候我们不必为其烦忧,但是解压缩文件的时候,你或许会想到ziparchive类里的extracto方法,但是这并解决不了中文名文件的问题,这是我们就需要需要用到这些函数:ziparchive里的numfile(获取文件数)和getnameindex(获取索引对应的文件名);然而这个方法在copy行不通,因为即使用ziparchive类打开了zip文件,但就此想要通过copy来复制zip包里的文件的话是不可行的!
    好在天无绝人之路,PHP的API提供了zip_file来进行操作zip包:
    1.首先利用$zip=zip_open("example.zip")来打开zip包,成功返回zip里的目录,失败返回false
    2.然后通过$zipfile=zip_read($zip)来一次读取zip包里的每一个文件柄(此时还不能得到文件里的内容),只有从上往下的顺序!可以通过zip_entry_filename($zipfile)来获取其名字。成功则返回文件柄,失败返回用false,此处用while可以遍历各个条目
    3.再通过$zipfilentry=zip_entry_open($zipfile)来打开这个文件柄,成功则返回打开的文件柄,失败返回false
    4.然后通过$zipfilentrycon=$zip_entry_read($zipfilentry)来读取文件的内容,成功则返回内容,失败则返回false
    5.此时再加入对于文件的操作完成复制到另一个文件里:    $file=fopen(iconv("utf-8","gb2312","测试.txt"),"w");
                                                        fputs($file,$zipfilentrycon);
                                                        fclose($file);
    6.关闭文件柄zip_entry_close($zipfilentry),
    7.关闭打开的zip文件zip_close($zip)

<?php
//zip之压缩一个文件
$zip=new ZipArchive();    //创建zip工具类
$zip->open("C:/orz.zip",$zip::CREATE);    //利用这个类里面的方法创建zip包并打开,,注意绝对路径为/
$zip->addFile(iconv("utf-8","gb2312","测试.txt"),iconv("utf-8","gb2312","测试.txt"));  //往包中添加文件
$zip->close();    //关闭这个包
?><?php
//zip之压缩多个文件
$file=array("测试.txt","独舞红尘.txt");
$zip=new ZipArchive();
$zip->open("test2.zip",$zip::CREATE);
foreach($file as $value){
$zip->addFile(iconv("utf-8","gb2312",$value),iconv("utf-8","gb2312",$value));
}
$zip->close();
?><?php
//zip之压缩目录与文件
function addFileToZip($path,$zip){$handler=opendir($path); //打开当前文件夹由$path指定。while(($filename=readdir($handler))!==false){if($filename != "." && $filename != ".."){//文件夹文件名字为'.'和‘..’,不要对他们进行操作if(is_dir($path."/".$filename)){// 如果读取的某个对象是文件夹,则递归addFileToZip($path."/".$filename, $zip);}else{ //将文件加入zip对象$zip->addFile($path."/".$filename);//该函数第二个参数是可选的,用来指定文件的名称,如果不选,则用basename()来代替}}}@closedir($path);//关闭打开的目录
}
$zip=new ZipArchive();
if($zip->open('rsa.zip', ZipArchive::OVERWRITE|ZipArchive::CREATE)=== TRUE){//如果只用ZipArchive::OVERWRITE那么如果指定目标存在的话就会复写,否则返回错误9,而两个都用则会避免这个错误addFileToZip('lala', $zip); //调用方法,对要打包的根目录进行操作,并将ZipArchive的对象传递给方法,注意"\"是转移字符,"/"不是$zip->close(); //关闭处理的zip文件
}
?><?php
//zip之解压目录与文件
class Unzip{public function __construct(){//init code here...header("content-type:text/html;charset=utf8");}/*** 解压文件到指定目录** @param  string  zip压缩文件的路径* @param  string  解压文件的目的路径* @param  boolean 是否以压缩文件的名字创建目标文件夹* @param  boolean 是否重写已经存在的文件** @return boolean 返回成功 或失败*/public function unzip($src_file, $dest_dir=false, $create_zip_name_dir=true, $overwrite=true){if ($zip = zip_open($src_file)){if ($zip){$splitter = ($create_zip_name_dir === true) ? "." : "/";if($dest_dir === false){$dest_dir = substr($src_file, 0, strrpos($src_file, $splitter))."/";}// 如果不存在 创建目标解压目录$this->create_dirs($dest_dir);// 对每个文件进行解压while ($zip_entry = zip_read($zip)){// 文件不在根目录$pos_last_slash = strrpos(zip_entry_name($zip_entry), "/");if ($pos_last_slash !== false){// 创建目录 在末尾带 /$this->create_dirs($dest_dir.substr(zip_entry_name($zip_entry), 0, $pos_last_slash+1));}// 打开包if (zip_entry_open($zip,$zip_entry,"r")){// 文件名保存在磁盘上$file_name = $dest_dir.zip_entry_name($zip_entry);// 检查文件是否需要重写if ($overwrite === true || $overwrite === false && !is_file($file_name)){// 读取压缩文件的内容$fstream = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));@file_put_contents($file_name, $fstream);// 设置权限chmod($file_name, 0777);echo "save: ".$file_name."<br />";}// 关闭入口zip_entry_close($zip_entry);}}// 关闭压缩包zip_close($zip);}}else{return false;}return true;}/*** 创建目录*/public function create_dirs($path){if (!is_dir($path)){$directory_path = "";$directories = explode("/",$path);array_pop($directories);foreach($directories as $directory){$directory_path .= $directory."/";if (!is_dir($directory_path)){mkdir($directory_path);chmod($directory_path, 0777);}}}}
}
/*using:$z = new Unzip();$z->unzip("./bootstrap-3.3.4.zip",'./unzipres/', true, false);
*/$z=new Unzip();$z->unzip("orzzzzzz.zip","d/",true,false);
?>

利用ziparchive压缩文件、zip_file解压文件相关推荐

  1. 【踩坑】Linux java中ftp下载文件,解压文件损坏,以及图片下载打开只显示下载路径的问题

    [踩坑]Linux java中ftp下载文件,解压文件损坏,以及图片下载打开只显示下载路径的问题 一. 问题重现 二. 问题解决思路 1. 确认是不是上传就导致数据出错了 2. 是不是平台问题 三. ...

  2. tar 打包文件与解压文件

    tar 命令打包文件与解压文件 打包文件 1.把/root目录下的test1整个打包为test1.tar文件,如下所示 [root@localhost ~]# pwd /root [root@loca ...

  3. LZMA压缩文件与解压文件

    Hello,我是KitStar. 以下文章整理的不对.还请见谅. Unity的Assetbundle是使用LZMA压缩算法压缩的,它是一个开源的类库,有C. C++.C#.JAVA的类库,Unity里 ...

  4. python打包zip文件_python 解压文件,合并文件 打包成zip格式文件 生成MD5值

    #!/usr/bin/env python #_*_encoding:utf-8 # 2018/05/29 #augustyang #2.0 ''' 解压文件,合并文件 打包成zip格式文件 生成MD ...

  5. 使用java程序下载远程zip文件并解压文件( 带注释解释代码)

    带注释解释代码 package com.zcl.Test;import java.io.*; import java.net.HttpURLConnection; import java.net.So ...

  6. Linux压缩文件与解压文件(*.zip)

    1.把/home目录下面的mydata目录压缩为mydata.zip zip -r mydata.zip mydata #压缩mydata目录 2.把/home目录下面的mydata.zip解压到my ...

  7. mac 压缩文件 or 解压文件

    一. zip命令 1. 压缩某文件的命令格式如下: zip [压缩后的文件名称] [被压缩的文件名称] 将11681005该文件夹压缩为picture.zip 文件,如图所示: 2. zip相关参数解 ...

  8. Linux下python如何解压rar文件,RAR解压文件

    默认在linux下我们不能解压压缩rar文件,那我们如何使用呢? 我们可以下载rarlinux安装包实现解压压缩后缀为rar的包 下载地址:https://www.rarlab.com/downloa ...

  9. 数据结构Java06【赫夫曼树、概述、原理分析、代码实现(数据压缩、创建编码表、解码、压缩文件、解压文件)】

    学习地址:[数据结构与算法基础-java版]                  

  10. 通过C#代码 压缩/解压文件

    通过引用一DLL(ICSharpCode.dll)可以实现所述功能... 一.压缩文件 using System; using ICSharpCode.SharpZipLib; using ICSha ...

最新文章

  1. [cocos2d-x][apk打包][Fatal signal 11][andriod]Eclipse编译Fatal signal 11报错-都是字符赋值惹的祸...
  2. 24点游戏c语言源代码6,C语言解24点游戏程序
  3. 关于JavaFX的最常见问题
  4. oracle安装静默
  5. System.Data.Sqlite批量添加数据
  6. 如果有一个想法,你如何表述?
  7. Presto 安装与部署
  8. java 中文网址大全
  9. 油猴子(Tampermonkey )API userscliptAPI 中文翻译
  10. Luogu_P4556 雨天的尾巴【题解】树上差分 线段树合并
  11. snapchat中国使用_如何使用Snapchat:发送快照和消息的基础
  12. Pandoc 安装与使用
  13. 用PC3000和HDD Unlock解笔记本硬盘密码
  14. 怎么将hashmap的数据传递给js_将Excel数据信息传递给Powerpoint应用
  15. 剑指Offer_入门_JZZ_斐波那契数列
  16. 国家信息系统安全等级保护基本要求——等保一级、二级、三级、四级内容
  17. Windows中查看8080端口的占用情况并关闭相关进程
  18. excel怎么批量添加单位平方米㎡
  19. java双骰儿赌博_java 编写程序:投掷2个骰子,200次
  20. 手把手教你修改Firefox的User-Agent伪装Android微信浏览器

热门文章

  1. 最大流 (Maximum Flow) 之 流网络和流
  2. WinForm嵌入Chrome内核浏览器
  3. 破产姐妹第六季/全集2 Broke Girls迅雷下载
  4. 微星X79主板修改BIOS支持NVMe
  5. ffmpeg的简单介绍、用ffmpeg下载blob加工后的视频(m3u8格式)
  6. CAD输出pdf显示失真
  7. 内存对齐、内存对齐规则解释、内存对齐原理
  8. 5.PB中调用存储过程
  9. unity 字体 素材_unity中文字体制作工具
  10. EasyPR转qt5-vs2013