zoukankan      html  css  js  c++  java
  • PHP 文件操作类(转载)

    <?php
    class File {
    
        /**
         * 创建多级目录
         * @param string $dir
         * @param int $mode
         * @return boolean
         */
        public function create_dir($dir, $mode = 0777) {
            return is_dir($dir) or ($this->create_dir(dirname($dir)) and mkdir($dir, $mode));
        }
    
        /**
         * 创建指定路径下的指定文件
         * @param string $path(需要包含文件名和后缀)
         * @param boolean $over_write 是否覆盖文件
         * @param int $time 设置时间。默认是当前系统时间
         * @param int $atime 设置访问时间。默认是当前系统时间
         * @return boolean
         */
        public function create_file($path, $over_write = FALSE, $time = NULL, $atime = NULL) {
            $path = $this->dir_replace($path);
            $time = empty($time) ? time() : $time;
            $atime = empty($atime) ? time() : $atime;
            if (file_exists($path) && $over_write) {
                $this->unlink_file($path);
            }
            $aimDir = dirname($path);
            $this->create_dir($aimDir);
            return touch($path, $time, $atime);
        }
    
        /**
         * 关闭文件操作
         * @param string $path
         * @return boolean
         */
        public function close($path) {
            return fclose($path);
        }
    
        /**
         * 读取文件操作
         * @param string $file
         * @return boolean
         */
        public function read_file($file) {
            return @file_get_contents($file);
        }
    
        /**
         * 确定服务器的最大上传限制(字节数)
         * @return int 服务器允许的最大上传字节数
         */
        public function allow_upload_size() {
            $val = trim(ini_get('upload_max_filesize'));
            return $val;
        }
    
        /**
         * 字节格式化 把字节数格式为 B K M G T P E Z Y 描述的大小
         * @param int $size 大小
         * @param int $dec 显示类型
         * @return int
         */
        public function byte_format($size, $dec = 2) {
            $a = array("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB");
            $pos = 0;
            while ($size >= 1024) {
                $size /= 1024;
                $pos++;
            }
            return round($size, $dec) . " " . $a[$pos];
        }
    
        /**
         * 删除非空目录
         * 说明:只能删除非系统和特定权限的文件,否则会出现错误
         * @param string $dirName 目录路径
         * @param boolean $is_all 是否删除所有
         * @param boolean $del_dir 是否删除目录
         * @return boolean
         */
        public function remove_dir($dir_path, $is_all = FALSE) {
            $dirName = $this->dir_replace($dir_path);
            $handle = @opendir($dirName);
            while (($file = @readdir($handle)) !== FALSE) {
                if ($file != '.' && $file != '..') {
                    $dir = $dirName . '/' . $file;
                    if ($is_all) {
                        is_dir($dir) ? $this->remove_dir($dir) : $this->unlink_file($dir);
                    } else {
                        if (is_file($dir)) {
                            $this->unlink_file($dir);
                        }
                    }
                }
            }
            closedir($handle);
            return @rmdir($dirName);
        }
    
        /**
         * 获取完整文件名
         * @param string $fn 路径
         * @return string
         */
        public function get_basename($file_path) {
            $file_path = $this->dir_replace($file_path);
            return basename(str_replace('\', '/', $file_path));
            //return pathinfo($file_path,PATHINFO_BASENAME);
        }
    
        /**
         * 获取文件后缀名
         * @param string $file_name 文件路径
         * @return string
         */
        public function get_ext($file) {
            $file = $this->dir_replace($file);
            //return strtolower(substr(strrchr(basename($file), '.'),1));
            //return end(explode(".",$filename ));
            //return strtolower(trim(array_pop(explode('.', $file))));//取得后缀
            //return preg_replace('/.*.(.*[^.].*)*/iU','\1',$file);
            return pathinfo($file, PATHINFO_EXTENSION);
        }
    
        /**
         * 取得指定目录名称
         * @param string $path 文件路径
         * @param int $num 需要返回以上级目录的数
         * @return string
         */
        public function father_dir($path, $num = 1) {
            $path = $this->dir_replace($path);
            $arr = explode('/', $path);
            if ($num == 0 || count($arr) < $num) {
                return pathinfo($path, PATHINFO_BASENAME);
            }
    
            return substr(strrev($path), 0, 1) == '/' ? $arr[(count($arr) - (1 + $num))] : $arr[(count($arr) - $num)];
        }
    
        /**
         * 删除文件
         * @param string $path
         * @return boolean
         */
        public function unlink_file($path) {
            $path = $this->dir_replace($path);
            if (file_exists($path)) {
                return unlink($path);
            }
        }
    
        /**
         * 文件操作(复制/移动)
         * @param string $old_path 指定要操作文件路径(需要含有文件名和后缀名)
         * @param string $new_path 指定新文件路径(需要新的文件名和后缀名)
         * @param string $type 文件操作类型
         * @param boolean $overWrite 是否覆盖已存在文件
         * @return boolean
         */
        public function handle_file($old_path, $new_path, $type = 'copy', $overWrite = FALSE) {
            $old_path = $this->dir_replace($old_path);
            $new_path = $this->dir_replace($new_path);
            if (file_exists($new_path) && $overWrite = FALSE) {
                return FALSE;
            } else if (file_exists($new_path) && $overWrite = TRUE) {
                $this->unlink_file($new_path);
            }
    
            $aimDir = dirname($new_path);
            $this->create_dir($aimDir);
            switch ($type) {
            case 'copy':
                return copy($old_path, $new_path);
                break;
            case 'move':
                return rename($old_path, $new_path);
                break;
            }
        }
    
        /**
         * 文件夹操作(复制/移动)
         * @param string $old_path 指定要操作文件夹路径
         * @param string $aimDir 指定新文件夹路径
         * @param string $type 操作类型
         * @param boolean $overWrite 是否覆盖文件和文件夹
         * @return boolean
         */
        public function handle_dir($old_path, $new_path, $type = 'copy', $overWrite = FALSE) {
            $new_path = $this->check_path($new_path);
            $old_path = $this->check_path($old_path);
            if (!is_dir($old_path)) {
                return FALSE;
            }
    
            if (!file_exists($new_path)) {
                $this->create_dir($new_path);
            }
    
            $dirHandle = opendir($old_path);
    
            if (!$dirHandle) {
                return FALSE;
            }
    
            $boolean = TRUE;
    
            while (FALSE !== ($file = readdir($dirHandle))) {
                if ($file == '.' || $file == '..') {
                    continue;
                }
    
                if (!is_dir($old_path . $file)) {
                    $boolean = $this->handle_file($old_path . $file, $new_path . $file, $type, $overWrite);
                } else {
                    $this->handle_dir($old_path . $file, $new_path . $file, $type, $overWrite);
                }
            }
            switch ($type) {
            case 'copy':
                closedir($dirHandle);
                return $boolean;
                break;
            case 'move':
                closedir($dirHandle);
                return rmdir($old_path);
                break;
            }
        }
    
        /**
         * 替换相应的字符
         * @param string $path 路径
         * @return string
         */
        public function dir_replace($path) {
            return str_replace('//', '/', str_replace('\', '/', $path));
        }
    
        /**
         * 读取指定路径下模板文件
         * @param string $path 指定路径下的文件
         * @return string $rstr
         */
        public function get_templtes($path) {
            $path = $this->dir_replace($path);
            if (file_exists($path)) {
                $fp = fopen($path, 'r');
                $rstr = fread($fp, filesize($path));
                fclose($fp);
                return $rstr;
            } else {
                return '';
            }
        }
    
        /**
         * 文件重命名
         * @param string $oldname
         * @param string $newname
         */
        public function rename($oldname, $newname) {
            if (($newname != $oldname) && is_writable($oldname)) {
                return rename($oldname, $newname);
            }
        }
    
        /**
         * 获取指定路径下的信息
         * @param string $dir 路径
         * @return ArrayObject
         */
        public function get_dir_info($dir) {
            $handle = @opendir($dir); //打开指定目录
            $directory_count = 0;
            while (FALSE !== ($file_path = readdir($handle))) {
                if ($file_path != "." && $file_path != "..") {
                    //is_dir("$dir/$file_path") ? $sizeResult += $this->get_dir_size("$dir/$file_path") : $sizeResult += filesize("$dir/$file_path");
                    $next_path = $dir . '/' . $file_path;
                    if (is_dir($next_path)) {
                        $directory_count++;
                        $result_value = self::get_dir_info($next_path);
                        $total_size += $result_value['size'];
                        $file_cout += $result_value['filecount'];
                        $directory_count += $result_value['dircount'];
                    } elseif (is_file($next_path)) {
                        $total_size += filesize($next_path);
                        $file_cout++;
                    }
                }
            }
            closedir($handle); //关闭指定目录
            $result_value['size'] = $total_size;
            $result_value['filecount'] = $file_cout;
            $result_value['dircount'] = $directory_count;
            return $result_value;
        }
    
        /**
         * 指定文件编码转换
         * @param string $path 文件路径
         * @param string $input_code 原始编码
         * @param string $out_code 输出编码
         * @return boolean
         */
        public function change_file_code($path, $input_code, $out_code) {
            if (is_file($path)) //检查文件是否存在,如果存在就执行转码,返回真
            {
                $content = file_get_contents($path);
                $content = string::chang_code($content, $input_code, $out_code);
                $fp = fopen($path, 'w');
                return fputs($fp, $content) ? TRUE : FALSE;
                fclose($fp);
            }
        }
    
        /**
         * 指定目录下指定条件文件编码转换
         * @param string $dirname 目录路径
         * @param string $input_code 原始编码
         * @param string $out_code 输出编码
         * @param boolean $is_all 是否转换所有子目录下文件编码
         * @param string $exts 文件类型
         * @return boolean
         */
        public function change_dir_files_code($dirname, $input_code, $out_code, $is_all = TRUE, $exts = '') {
            if (is_dir($dirname)) {
                $fh = opendir($dirname);
                while (($file = readdir($fh)) !== FALSE) {
                    if (strcmp($file, '.') == 0 || strcmp($file, '..') == 0) {
                        continue;
                    }
                    $filepath = $dirname . '/' . $file;
    
                    if (is_dir($filepath) && $is_all == TRUE) {
                        $files = $this->change_dir_files_code($filepath, $input_code, $out_code, $is_all, $exts);
                    } else {
                        if ($this->get_ext($filepath) == $exts && is_file($filepath)) {
                            $boole = $this->change_file_code($filepath, $input_code, $out_code, $is_all, $exts);
                            if (!$boole) {
                                continue;
                            }
    
                        }
                    }
                }
                closedir($fh);
                return TRUE;
            } else {
                return FALSE;
            }
        }
    
        /**
         * 列出指定目录下符合条件的文件和文件夹
         * @param string $dirname 路径
         * @param boolean $is_all 是否列出子目录中的文件
         * @param string $exts 需要列出的后缀名文件
         * @param string $sort 数组排序
         * @return ArrayObject
         */
        public function list_dir_info($dirname, $is_all = FALSE, $exts = '', $sort = 'ASC') {
            //处理多于的/号
            $new = strrev($dirname);
            if (strpos($new, '/') == 0) {
                $new = substr($new, 1);
            }
            $dirname = strrev($new);
    
            $sort = strtolower($sort); //将字符转换成小写
    
            $files = array();
            $subfiles = array();
    
            if (is_dir($dirname)) {
                $fh = opendir($dirname);
                while (($file = readdir($fh)) !== FALSE) {
                    if (strcmp($file, '.') == 0 || strcmp($file, '..') == 0) {
                        continue;
                    }
    
                    $filepath = $dirname . '/' . $file;
    
                    switch ($exts) {
                    case '*':
                        if (is_dir($filepath) && $is_all == TRUE) {
                            $files = array_merge($files, self::list_dir_info($filepath, $is_all, $exts, $sort));
                        }
                        array_push($files, $filepath);
                        break;
                    case 'folder':
                        if (is_dir($filepath) && $is_all == TRUE) {
                            $files = array_merge($files, self::list_dir_info($filepath, $is_all, $exts, $sort));
                            array_push($files, $filepath);
                        } elseif (is_dir($filepath)) {
                            array_push($files, $filepath);
                        }
                        break;
                    case 'file':
                        if (is_dir($filepath) && $is_all == TRUE) {
                            $files = array_merge($files, self::list_dir_info($filepath, $is_all, $exts, $sort));
                        } elseif (is_file($filepath)) {
                            array_push($files, $filepath);
                        }
                        break;
                    default:
                        if (is_dir($filepath) && $is_all == TRUE) {
                            $files = array_merge($files, self::list_dir_info($filepath, $is_all, $exts, $sort));
                        } elseif (preg_match("/.($exts)/i", $filepath) && is_file($filepath)) {
                            array_push($files, $filepath);
                        }
                        break;
                    }
    
                    switch ($sort) {
                    case 'asc':
                        sort($files);
                        break;
                    case 'desc':
                        rsort($files);
                        break;
                    case 'nat':
                        natcasesort($files);
                        break;
                    }
                }
                closedir($fh);
                return $files;
            } else {
                return FALSE;
            }
        }
    
        /**
         * 返回指定路径的文件夹信息,其中包含指定路径中的文件和目录
         * @param string $dir
         * @return ArrayObject
         */
        public function dir_info($dir) {
            return scandir($dir);
        }
    
        /**
         * 判断目录是否为空
         * @param string $dir
         * @return boolean
         */
        public function is_empty($dir) {
            $handle = opendir($dir);
            while (($file = readdir($handle)) !== false) {
                if ($file != '.' && $file != '..') {
                    closedir($handle);
                    return true;
                }
            }
            closedir($handle);
            return false;
        }
    
        /**
         * 返回指定文件和目录的信息
         * @param string $file
         * @return ArrayObject
         */
        public function list_info($file) {
            $dir = array();
            $dir['filename'] = basename($file); //返回路径中的文件名部分。
            $dir['pathname'] = realpath($file); //返回绝对路径名。
            $dir['owner'] = fileowner($file); //文件的 user ID (所有者)。
            $dir['perms'] = fileperms($file); //返回文件的 inode 编号。
            $dir['inode'] = fileinode($file); //返回文件的 inode 编号。
            $dir['group'] = filegroup($file); //返回文件的组 ID。
            $dir['path'] = dirname($file); //返回路径中的目录名称部分。
            $dir['atime'] = fileatime($file); //返回文件的上次访问时间。
            $dir['ctime'] = filectime($file); //返回文件的上次改变时间。
            $dir['perms'] = fileperms($file); //返回文件的权限。
            $dir['size'] = filesize($file); //返回文件大小。
            $dir['type'] = filetype($file); //返回文件类型。
            $dir['ext'] = is_file($file) ? pathinfo($file, PATHINFO_EXTENSION) : ''; //返回文件后缀名
            $dir['mtime'] = filemtime($file); //返回文件的上次修改时间。
            $dir['isDir'] = is_dir($file); //判断指定的文件名是否是一个目录。
            $dir['isFile'] = is_file($file); //判断指定文件是否为常规的文件。
            $dir['isLink'] = is_link($file); //判断指定的文件是否是连接。
            $dir['isReadable'] = is_readable($file); //判断文件是否可读。
            $dir['isWritable'] = is_writable($file); //判断文件是否可写。
            $dir['isUpload'] = is_uploaded_file($file); //判断文件是否是通过 HTTP POST 上传的。
            return $dir;
        }
    
        /**
         * 返回关于打开文件的信息
         * @param $file
         * @return ArrayObject
         * 数字下标     关联键名(自 PHP 4.0.6)     说明
         * 0     dev     设备名
         * 1     ino     号码
         * 2     mode     inode 保护模式
         * 3     nlink     被连接数目
         * 4     uid     所有者的用户 id
         * 5     gid     所有者的组 id
         * 6     rdev     设备类型,如果是 inode 设备的话
         * 7     size     文件大小的字节数
         * 8     atime     上次访问时间(Unix 时间戳)
         * 9     mtime     上次修改时间(Unix 时间戳)
         * 10     ctime     上次改变时间(Unix 时间戳)
         * 11     blksize     文件系统 IO 的块大小
         * 12     blocks     所占据块的数目
         */
        public function open_info($file) {
            $file = fopen($file, "r");
            $result = fstat($file);
            fclose($file);
            return $result;
        }
    
        /**
         * 改变文件和目录的相关属性
         * @param string $file 文件路径
         * @param string $type 操作类型
         * @param string $ch_info 操作信息
         * @return boolean
         */
        public function change_file($file, $type, $ch_info) {
            switch ($type) {
            case 'group':$is_ok = chgrp($file, $ch_info); //改变文件组。
                break;
            case 'mode':$is_ok = chmod($file, $ch_info); //改变文件模式。
                break;
            case 'ower':$is_ok = chown($file, $ch_info); //改变文件所有者。
                break;
            }
        }
    
        /**
         * 取得文件路径信息
         * @param $full_path 完整路径
         * @return ArrayObject
         */
        public function get_file_type($path) {
            //pathinfo() 函数以数组的形式返回文件路径的信息。
            //---------$file_info = pathinfo($path); echo file_info['extension'];----------//
            //extension取得文件后缀名【pathinfo($path,PATHINFO_EXTENSION)】-----dirname取得文件路径【pathinfo($path,PATHINFO_DIRNAME)】-----basename取得文件完整文件名【pathinfo($path,PATHINFO_BASENAME)】-----filename取得文件名【pathinfo($path,PATHINFO_FILENAME)】
            return pathinfo($path);
        }
    
        /**
         * 取得上传文件信息
         * @param $file file属性信息
         * @return array
         */
        public function get_upload_file_info($file) {
            $file_info = $_FILES[$file]; //取得上传文件基本信息
            $info = array();
            $info['type'] = strtolower(trim(stripslashes(preg_replace("/^(.+?);.*$/", "\1", $file_info['type'])), '"')); //取得文件类型
            $info['temp'] = $file_info['tmp_name']; //取得上传文件在服务器中临时保存目录
            $info['size'] = $file_info['size']; //取得上传文件大小
            $info['error'] = $file_info['error']; //取得文件上传错误
            $info['name'] = $file_info['name']; //取得上传文件名
            $info['ext'] = $this->get_ext($file_info['name']); //取得上传文件后缀
            return $info;
        }
    
        /**
         * 设置文件命名规则
         * @param string $type 命名规则
         * @param string $filename 文件名
         * @return string
         */
        public function set_file_name($type) {
            switch ($type) {
            case 'hash':$new_file = md5(uniqid(mt_rand())); //mt_srand()以随机数md5加密来命名
                break;
            case 'time':$new_file = time();
                break;
            default:$new_file = date($type, time()); //以时间格式来命名
                break;
            }
            return $new_file;
        }
    
        /**
         * 文件保存路径处理
         * @return string
         */
        public function check_path($path) {
            return (preg_match('//$/', $path)) ? $path : $path . '/';
        }
    
        public function down_remote_file($url, $save_dir = '', $filename = '', $type = 0) {
    
            if (trim($url) == '') {
                return array('file_name' => '', 'save_path' => '', 'error' => 1);
            }
            if (trim($save_dir) == '') {
                $save_dir = './';
            }
            if (trim($filename) == '') {
    //保存文件名
                $ext = strrchr($url, '.');
                //    if($ext!='.gif'&&$ext!='.jpg'){
                //        return array('file_name'=>'','save_path'=>'','error'=>3);
                //    }
                $filename = time() . $ext;
            }
            if (0 !== strrpos($save_dir, '/')) {
                $save_dir .= '/';
            }
            //创建保存目录
            if (!file_exists($save_dir) && !mkdir($save_dir, 0777, true)) {
                return array('file_name' => '', 'save_path' => '', 'error' => 5);
            }
            //获取远程文件所采用的方法
            if ($type) {
                $ch = curl_init();
                $timeout = 5;
                curl_setopt($ch, CURLOPT_URL, $url);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
                $img = curl_exec($ch);
                curl_close($ch);
            } else {
                ob_start();
                readfile($url);
                $img = ob_get_contents();
                ob_end_clean();
            }
            //$size=strlen($img);
            //文件大小
            $fp2 = fopen($save_dir . $filename, 'a');
    
            fwrite($fp2, $img);
            fclose($fp2);
            unset($img, $url);
            return array('file_name' => $filename, 'save_path' => $save_dir . $filename, 'error' => 0);
        }
    
    }

    https://blog.csdn.net/yonggeit/article/details/77512794

  • 相关阅读:
    Linux 系统下10个查看网络与监听的命令
    Linux下用gdb 调试、查看代码堆栈
    GPIO引脚速度的应用匹配
    编写安全的代码——小心有符号数的右移操作
    C语言实现类似C++的容器vector
    求字符串长度之递归与非递归的C语言实现
    字符串拷贝函数递归与非递归的C语言实现
    WriteLogHelper
    JsonHelper
    ConfigHelper
  • 原文地址:https://www.cnblogs.com/xiaoliwang/p/9011928.html
Copyright © 2011-2022 走看看