php目录文件在线解压缩程序
本文章提供一款完整的php目录 文件在线解压缩程序,他可打包指定目录并且把目录下所有目录与文件名都打包好,按rar的方式打包,目录结构不变,同时也提供解压功能.代码如下:
<?php $fz = new fmzip; $fz->setzipname("打包文件名"); //打包/压缩 $fz->setsource("待打包目录"); $fz->compress($silent, $compress); //解包/解压 $fz->settarget("待解包目录"); $fz->uncompress($silent); class fmzip { var $source; //压缩源 var $target; //解压目的文件夹 var $zipname; //压缩文件名 var $handle; //打开压缩文件的句柄 var $silent; //是否输出 var $count_dir; //计数器_文件夹 var $count_file; //计数器_文件 var $dirlist; function setsource($source) //设置压缩源 { if (!file_exists($source)) die("source <$source> does not exist."); $this->source = $source; } function settarget($target) //设置解压目的文件夹 { if (!file_exists($target)) $this->makedir($target); chdir(dirname($_server['script_filename'])); if (substr($target, -1) == "/") $target = substr($target, 0, strlen($target) - 1); if (!file_exists($target)) { die("target <$target> does not exist."); } $this->target = $target; } function setzipname($zipname) //设置压缩文件名 { if (emptyempty($zipname)) $zipname = "fmzip.fz"; $this->zipname = $zipname; } function compress($silent = false, $compress = true) //压缩 { $this->silent = $silent; if ($silent === false) echo "<pre>compressing...rn"; if (is_file("$this->zipname")) unlink("$this->zipname"); $this->handle = fopen($this->zipname, "w"); //创建压缩文件 if ($this->handle == null) die("error creating $this->zipname"); //打开失败 $this->count_dir = 0; $this->count_file = 0; //初始化计数器 $this->merge($this->source); //压缩 fwrite($this->handle, "-1"); //结束标志 fclose($this->handle); //关闭文件 echo "rndirectory: $this->count_dir"; echo "rnfile: $this->count_filern"; if (function_exists("gzcompress") && $compress == true) { file_put_contents("$this->zipname.gz", gzcompress(file_get_contents("$this->zipname"))); unlink("$this->zipname"); } if ($silent === false) { echo $this->listfile(); echo "</pre>"; } } function listfile() { if (file_exists("$this->zipname.gz")) return "<a href="$this->zipname . gz" target="_blank">download $this->zipname.gz</a>"; if (file_exists("$this->zipname")) return "<a href="$this->zipname" target="_blank">download $this->zipname</a>"; } function merge($dir) //合并文件、文件夹(递归) { /* 说明:不处理link。 */ if (is_dir($dir)) //如果压缩源是文件夹 { $list = scandir($dir); //扫描文件列表 natcasesort($list); foreach ($list as $file) //先处理文件夹 { $full = "$dir/$file"; if (!is_dir($full) || $file == "." || $file == "..") continue; //只处理文件夹 $this->count_dir++; if ($this->silent === false) echo "[dir] $fullrn"; //输出提示 fwrite($this->handle, $this->file_info($full)); //写入文件夹信息 $this->merge($full); //递归合并下级文件夹 } //文件夹处理完毕; foreach ($list as $file) //处理文件 { $full = "$dir/$file"; if (!is_file($full) || $file == "." || $file == "..") continue; //只处理文件 $this->count_file++; if ($this->silent === false) echo "[file] $fullrn"; //输出提示 fwrite($this->handle, $this->file_info($full)); //写入文件信息 } //文件处理完毕 } else { $this->count_file++; if ($this->silent === false) echo "[file] $fullrn"; //输出提示 fwrite($this->handle, $this->file_info($file)); //写入文件信息 } } //end function merge function file_info($file) { $perm = substr(sprintf('%o', fileperms($file)) , -3); //权限 $filename = str_replace($this->source, "", $file); if (is_file($file)) //文件 { $size = filesize($file); //文件大小 return "1rn$filenamern$permrn$sizern" . file_get_contents($file) . "rn"; // .文件内容 } if (is_dir($file)) //目录 return "0rn$filenamern$permrn"; } //end function file_info function uncompress($silent = false) { $this->silent = $silent; if ($silent === false) echo "<pre>uncompressing...rn"; if (substr($this->zipname, -3) == ".gz") $this->zipname = substr($this->zipname, 0, strlen($this->zipname) - 3); if (file_exists("$this->zipname.gz")) { if (!function_exists(gzuncompress)) die("function gzuncompress is not supported. unable to continue."); file_put_contents($this->zipname, gzuncompress(file_get_contents("$this->zipname.gz"))); } $this->handle = fopen($this->zipname, "r"); if ($this->handle == null) die("error reading $this->zipname"); //打开失败 $count = 0; while (1) { $count++; $type = $this->read_line(); //读取类型 if ($type === "-1") break; //处理完毕,退出 $filename = $this->target . $this->read_line(); //读取文件名 $permission = $this->read_line(); //读取权限 /* <文件夹> [0]n[file_name]n[perm]n */ if ($type === "0") //目录 { if ($this->silent === false) //输出提示 echo "[dir] $filename [$permission]rn"; $this->makedir($filename); //创建文件夹 chdir(dirname($_server['script_filename'])); chmod($filename, $permission); $this->dirlist[$filename] = 1; continue; } /* <文件> [1]n[file_name]n[perm]n[size]n[contents]n */ if ($type === "1") //文件 { $this->count_file++; $size = $this->read_line(); //读取文件大小 if ($this->silent === false) //输出提示 echo "[file] $filename [$permission] [size = $size]rn"; if ($size != 0) { $fp = fopen($filename, "w"); $contents = fread($this->handle, $size); fwrite($fp, $contents); fclose($fp); chmod($filename, $permission); } $this->read_line(); //内容后的一个回车 continue; } } $this->count_dir = count($this->dirlist); if ($silent === false) echo "ndirectory: $this->count_dir"; echo "nfile: $this->count_filen</pre>n"; fclose($this->handle); if (file_exists("$this->zipname.gz")) unlink("$this->zipname"); } //end function uncompress; function read_line() { $a = fgets($this->handle); $a = str_replace("rn", "", $a); $a = str_replace("n", "", $a); return $a; } function makedir($full) { list($a, $b) = split("/", $full, 2); if ($a == "") return; if (file_exists($a) && !is_dir($a)) die("can't create dir $a"); if (!file_exists($a)) @mkdir($a); chdir($a); if ($b !== "") $this->makedir($b); chdir(".."); } //end function makedir } //end class fmzip ?>
//使用方法:
#必须
include("包含这个class的php文件");
$fz = new fmzip;
$fz->setzipname("打包文件名");
#打包/压缩
$fz->setsource("待打包目录");
$fz->compress($silent,$compress);
#解包/解压
$fz->settarget("待解包目录");
$fz->uncompress($silent);
$silent : true|false (不加引号!) 是否产生输出 默认为true,不产生
$compress : true|false (不加引号!) 是否压缩 默认为true,压缩
教程链接:http://www.phprm.com/wenjian/fs4259.html
随意转载~但请保留教程地址★