首页 > php文件操作 > php目录文件在线解压缩程序

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

随意转载~但请保留教程地址★

标签:php目录文件 在线解压缩

发表留言