当前位置:首页 > PHP教程 > php文件操作 > 列表

php目录文件在线解压缩程序

发布:smiling 来源: PHP粉丝网  添加日期:2014-08-15 14:42:29 浏览: 评论:0 

本文章提供一款完整的php目录 文件在线解压缩程序,他可打包指定目录并且把目录下所有目录与文件名都打包好,按rar的方式打包,目录结构不变,同时也提供解压功能.代码如下:

  1. $fz = new fmzip; 
  2. $fz->setzipname("打包文件名"); 
  3.  
  4. #打包/压缩 
  5. $fz->setsource("待打包目录"); 
  6. $fz->compress($silent,$compress); 
  7.  
  8. #解包/解压 
  9. $fz->settarget("待解包目录"); 
  10. $fz->uncompress($silent); 
  11. */ 
  12. class fmzip 
  13.  
  14. var $source//压缩源 
  15. var $target//解压目的文件夹 
  16. var $zipname;//压缩文件名 
  17. var $handle//打开压缩文件的句柄 
  18. var $silent//是否输出 
  19. var $count_dir//计数器_文件夹 
  20. var $count_file;//计数器_文件 
  21. var $dirlist
  22.  
  23. function setsource($source)//设置压缩源 
  24.   if(!file_exists($source)) 
  25.     die("source <$source> does not exist."); 
  26.   $this->source = $source
  27.  
  28. function settarget($target)//设置解压目的文件夹 
  29.   if(!file_exists($target)) 
  30.     $this->makedir($target); 
  31.   chdir(dirname($_server['script_filename'])); 
  32.   if(substr($target,-1)=="/"
  33.     $target = substr($target,0,strlen($target)-1); 
  34.   if(!file_exists($target)) 
  35.   { 
  36.     die("target <$target> does not exist."); 
  37.   } 
  38.   $this->target = $target
  39.  
  40. function setzipname($zipname)//设置压缩文件名 
  41.   if(emptyempty($zipname)) $zipname = "fmzip.fz"
  42.   $this->zipname = $zipname
  43.  
  44. function compress($silent = false, $compress = true) //压缩 
  45.   $this->silent = $silent
  46.   if($silent===false)echo "<pre>compressing...rn"
  47.   if(is_file("$this->zipname"))unlink("$this->zipname"); 
  48.   $this->handle = fopen($this->zipname,"w");//创建压缩文件 
  49.   if($this->handle == null) die("error creating $this->zipname");//打开失败 
  50.   $this->count_dir = 0; $this->count_file = 0; //初始化计数器 
  51.   $this->merge($this->source);//压缩 
  52.   fwrite($this->handle,"-1");//结束标志 
  53.   fclose($this->handle);//关闭文件 
  54.   echo "rndirectory: $this->count_dir"
  55.   echo "rnfile: $this->count_filern"
  56.   if(function_exists("gzcompress") && $compress==true) 
  57.   { 
  58.     file_put_contents("$this->zipname.gz",gzcompress(file_get_contents("$this->zipname"))); 
  59.     unlink("$this->zipname"); 
  60.   } 
  61.   if($silent===false) 
  62.   { 
  63.     echo $this->listfile(); 
  64.     echo "</pre>"
  65.   } 
  66.  
  67. function listfile() 
  68.   if(file_exists("$this->zipname.gz")) 
  69.     return "<a href="$this->zipname.gz" target="_blank">download $this->zipname.gz</a>"
  70.   if(file_exists("$this->zipname")) 
  71.     return "<a href="$this->zipname" target="_blank">download $this->zipname</a>"
  72.  
  73. function merge($dir)//合并文件、文件夹(递归) 
  74. /* 说明:不处理link。 */ 
  75.  if(is_dir($dir))//如果压缩源是文件夹 
  76.  { 
  77.   $list = scandir($dir);//扫描文件列表 
  78.   natcasesort($list); 
  79.   foreach($list as $file)//先处理文件夹 
  80.   { 
  81.     $full = "$dir/$file"
  82.     if(!is_dir($full)||$file=="."||$file=="..")continue;//只处理文件夹 
  83.     $this->count_dir++; 
  84.     if($this->silent===false) 
  85.       echo "[dir] $fullrn"//输出提示 
  86.     fwrite($this->handle,$this->file_info($full));//写入文件夹信息 
  87.     $this->merge($full);//递归合并下级文件夹 
  88.   }//文件夹处理完毕; 
  89.   foreach($list as $file)//处理文件 
  90.   { 
  91.     $full = "$dir/$file"
  92.     if(!is_file($full)||$file=="."||$file=="..")continue//只处理文件 
  93.     $this->count_file++; 
  94.     if($this->silent===false) 
  95.       echo "[file] $fullrn";//输出提示 
  96.     fwrite($this->handle,$this->file_info($full));//写入文件信息 
  97.   }//文件处理完毕 
  98.  } 
  99.  else 
  100.  { 
  101.    $this->count_file++; 
  102.    if($this->silent===false)echo "[file] $fullrn";//输出提示 
  103.    fwrite($this->handle,$this->file_info($file));//写入文件信息 
  104.  } 
  105. }//end function merge 
  106.  
  107. function file_info($file
  108.   $perm = substr(sprintf('%o',fileperms($file)), -3); //权限 
  109.   $filename = str_replace($this->source,"",$file); 
  110.   if(is_file($file))//文件 
  111.   { 
  112.     $size = filesize($file); //文件大小 
  113.     return "1rn$filenamern$permrn$sizern".file_get_contents($file)."rn";// .文件内容 
  114.   } 
  115.   if(is_dir($file))//目录 
  116.     return "0rn$filenamern$permrn"
  117. }//end function file_info 
  118.  
  119. function uncompress($silent = false) 
  120.   $this->silent = $silent
  121.   if($silent===false)echo "<pre>uncompressing...rn"
  122.   if(substr($this->zipname,-3)==".gz"
  123.     $this->zipname = substr($this->zipname,0,strlen($this->zipname)-3); 
  124.   if(file_exists("$this->zipname.gz")) 
  125.   { 
  126.     if(!function_exists(gzuncompress)) 
  127.       die("function gzuncompress is not supported. unable to continue."); 
  128.     file_put_contents($this->zipname,gzuncompress(file_get_contents("$this->zipname.gz"))); 
  129.   } 
  130.   $this->handle = fopen($this->zipname,"r"); 
  131.   if($this->handle == null) die("error reading $this->zipname");//打开失败 
  132.   $count = 0; 
  133.   while(1) 
  134.   { 
  135.     $count ++; 
  136.     $type = $this->read_line(); //读取类型 
  137.     if($type === "-1")break;//处理完毕,退出 
  138.     $filename = $this->target.$this->read_line();//读取文件名 
  139.     $permission = $this->read_line();//读取权限 
  140. /* <文件夹> [0]n[file_name]n[perm]n */ 
  141.     if($type === "0")//目录 
  142.     { 
  143.       if($this->silent === false)//输出提示 
  144.         echo "[dir] $filename  [$permission]rn"
  145.       $this->makedir($filename);//创建文件夹 
  146.       chdir(dirname($_server['script_filename'])); 
  147.       chmod($filename,$permission); 
  148.       $this->dirlist[$filename] = 1; 
  149.       continue
  150.     } 
  151. /* <文件> [1]n[file_name]n[perm]n[size]n[contents]n */ 
  152.     if($type === "1")//文件 
  153.     { 
  154.       $this->count_file++; 
  155.       $size = $this->read_line(); //读取文件大小 
  156.       if($this->silent === false)//输出提示 
  157.         echo "[file] $filename  [$permission] [size = $size]rn"
  158.       if($size!=0) 
  159.       { 
  160.         $fp = fopen($filename,"w"); 
  161.         $contents = fread($this->handle,$size); 
  162.         fwrite($fp,$contents); 
  163.         fclose($fp); 
  164.         chmod($filename,$permission); 
  165.       } 
  166.       $this->read_line();//内容后的一个回车 
  167.       continue
  168.     } 
  169.   } 
  170.   $this->count_dir = count($this->dirlist); 
  171.   if($silent===false) 
  172.     echo "ndirectory: $this->count_dir"
  173.     echo "nfile: $this->count_filen</pre>n"
  174.   fclose($this->handle); 
  175.   if(file_exists("$this->zipname.gz"))unlink("$this->zipname"); 
  176. }//end function uncompress; 
  177.  
  178. function read_line() 
  179.   $a = fgets($this->handle); 
  180.   $a = str_replace("rn","",$a); 
  181.   $a = str_replace("n","",$a); 
  182.   return $a
  183.  
  184. function makedir($full
  185.   list($a,$b) = split("/",$full,2); 
  186.   if($a == ""return
  187.   if(file_exists($a)&&!is_dir($a))die("can't create dir $a"); 
  188.   if(!file_exists($a))@mkdir($a); 
  189.   chdir($a);//开源代码phpfensi.com 
  190.   if($b!==""
  191.     $this->makedir($b); 
  192.   chdir(".."); 
  193. }//end function makedir 
  194.  
  195. //end class fmzip 
  196.  
  197. /* 
  198.  
  199.  
  200. //使用方法: 
  201.  
  202. #必须 
  203. include("包含这个class的php文件"); 
  204. $fz = new fmzip; 
  205. $fz->setzipname("打包文件名"); 
  206.  
  207. #打包/压缩 
  208. $fz->setsource("待打包目录"); 
  209. $fz->compress($silent,$compress); 
  210.  
  211. #解包/解压 
  212. $fz->settarget("待解包目录"); 
  213. $fz->uncompress($silent); 
  214.  
  215. $silent : true|false (不加引号!) 是否产生输出 默认为true,不产生 
  216. $compress : true|false (不加引号!) 是否压缩 默认为true,压缩 

Tags: php目录文件 在线解压缩

分享到: