zoukankan      html  css  js  c++  java
  • php 的文件操作类

    <?php
    header('Content-type:text/html;charset=utf8');
    
    Class FILE
    {
        private static $path;
        private static $files = [];
        private static $dirs = [];
    
        private function __construct($path)
        {
            try {
                if (is_dir($path)) {
                    self::$path = strtr($path, ['\' => '/']);
                }
            } catch (Exception $e) {
                echo $e->getMessage();
            }
        }
    
        private function runFiles($path)
        {
            $arr = ['files' => [], 'dirs' => [], 'all' => []];
            $target = array_diff(scandir($path), ['.', '..']);
            array_walk($target, function ($val, $key) use (&$arr, $path) {
                $subTarget = "{$path}/{$val}";
                if (is_file($subTarget)) {
                    array_push($arr['files'], "{$path}/" . $val);
                } else if (is_dir($subTarget)) {
                    array_push($arr['dirs'], "{$path}/" . $val);
                    $arr = array_merge_recursive($arr, $this->runFiles($subTarget));
                }
            });
            return $arr;
        }
    
        /**新建文件夹,如果目标文件夹不存在的情况下
         * @param $target
         * @return mixed
         */
        private static function createFile($target)
        {
            if (!is_dir($target)) {
                mkdir($target, 0777, true);
            }
            return $target;
        }
    
        /**判断是否是空的文件夹
         * @param $dir
         * @return bool
         */
        private static function isEmptyDir($dir)
        {
            $arr = array_diff(scandir($dir), ['.', '..']);
            return count($arr) == 0 ? true : false;
        }
    
        /**初始化
         * @param $path
         * @return FILE
         */
        public static function init($path)
        {
            $cls = new self($path);
            $all = $cls->runFiles(self::$path);
            self::$files = $all['files'];
            self::$dirs = $all['dirs'];
            return $cls;
        }
    
        /**处理文件如复制或移动
         * @param $target
         * @param $mode
         * @param $extension
         * @return int
         */
        private function dealFile($target, $mode, $extension)
        {
            $target = self::createFile($target);
            $result = 0;
            array_walk(self::$files, function ($val) use ($target, $extension, $mode, &$result) {
                $info = pathinfo($val);
                if (!$extension || ($extension && strcasecmp($info['extension'], $extension) == 0)) {
                    $res = strcasecmp($mode, 'move') == 0 ? rename($val, $target . '/' . $info['basename']) : copy($val, $target . '/' . $info['basename']);
                    if ($res) {
                        $result++;
                    }
                }
            });
            return $result;
        }
    
        /**获取真实的文件路径
         * @return array
         */
        public function getRawFiles()
        {
            return self::$files;
        }
    
        /**获取真实的文件夹路径
         * @return array
         */
        public function getRawDirs()
        {
            return self::$dirs;
        }
    
        /**获取全部的文件名
         * @return array
         */
        public function getFiles()
        {
            $arr = [];
            array_walk(self::$files, function ($val) use (&$arr) {
                array_push($arr, basename($val));
            });
            return $arr;
        }
    
        /**获取所有的文件夹
         * @return array
         */
        public function getDirs()
        {
            $arr = [];
            array_walk(self::$dirs, function ($val) use (&$arr) {
                array_push($arr, basename($val));
            });
            return $arr;
    
        }
    
        /**获取树形结构图,注意这边的引用传值
         * @return array
         */
        public function getTree()
        {
            $all = array_merge(self::$dirs, self::$files);
            $tree = [];
            $diff = explode('/', self::$path);
            if ($all) {
                array_walk($all, function ($val) use ($diff, &$tree) {
                    $temp_arr = explode('/', $val);
                    if (is_file($val)) {
                        $file = end($temp_arr);
                        array_push($diff, $file);
                    }
                    $temp_arr = array_diff($temp_arr, $diff);
                    $parent =& $tree;
                    foreach ($temp_arr as $k => $v) {
                        if (!$parent[$v]) {
                            $parent[$v] = [];
                        }
                        $parent =& $parent[$v];
                    }
                    if (is_file($val)) {
                        array_push($parent, $file);
                    }
                });
            }
            return $tree;
        }
    
        /**展示文件夹的信息
         * @return array
         */
        public function getInfo()
        {
            $files = self::$files;
            $dirs = self::$dirs;
            $size = 0;
            array_walk($files, function ($val) use (&$size) {
                $size += filesize($val);
            });
            return [
                'size' => $size,
                'dirs' => count($dirs),
                'files' => count($files)
            ];
        }
    
        /**进行文件拷贝
         * @param $target
         * @param null $type
         * @return int
         */
        public function copyFiles($target, $type = null)
        {
            return $this->dealFile($target, 'copy', $type);
        }
    
        /**复制所有的空文件夹
         * @param $target
         * @return int
         */
        public function copyDirs($target)
        {
            $dirs = self::$dirs;
            $target = strtr(trim($target), ['\' => '/']);
            $target_arr = explode('/', $target);
            if (end($target_arr) == '') {
                array_pop($target_arr);
            }
            $diff = explode('/', self::$path);
            $count = 0;
            array_walk($dirs, function ($val) use (&$count, $target_arr, $diff) {
                $temp_arr = array_diff(explode('/', $val), $diff);
                $new_path = implode('/', $target_arr) . '/' . implode('/', $temp_arr);
                if (mkdir($new_path, 0777, true)) {
                    $count++;
                }
            });
            return $count;
        }
    
        /**文件的剪切
         * @param $target
         * @param null $type
         * @return int
         */
        public function moveFiles($target, $type = null)
        {
            return $this->dealFile($target, 'move', $type);
        }
    
        /**剪切所有的文件夹以及文件
         * @param $target
         * @return array
         */
        public function moveAll($target)
        {
            $dirs = $this->copyDirs($target);
            $files = self::$files;
            $target_arr = explode('/', $target);
            if (end($target_arr) == '') {
                array_pop($target_arr);
            }
            $diff = explode('/', self::$path);
            $count = 0;
            array_walk($files, function ($val) use (&$count, $target_arr, $diff) {
                $temp_arr = array_diff(explode('/', $val), $diff);
                $new_path = implode('/', $target_arr) . '/' . implode('/', $temp_arr);
                if (rename($val, $new_path)) {
                    $count++;
                }
            });
            $this->removeAll();
            return [
                'files' => $count,
                'dirs' => $dirs
            ];
        }
    
        /**删除指定目录下的所有文件
         * @return int
         */
        public function removeFiles()
        {
            $count = 0;
            array_walk(self::$files, function ($val) use (&$count) {
                if (unlink($val)) {
                    $count++;
                }
            });
            return $count;
        }
    
        /**进行删除文件夹所有内容的操作
         * @return bool
         */
        public function removeAll()
        {
            $dirs = self::$dirs;
            //进行文件夹排序
            uasort($dirs, function ($m, $n) {
                return strlen($m) > strlen($n) ? -1 : 1;
            });
            //删除所有文件
            $this->removeFiles();
            array_walk($dirs, function ($val) {
                rmdir($val);
            });
            return self::isEmptyDir(self::$path);
        }
    }
    
    $path = 'd:/filetest';
    $target = 'd:/yftest';
    //所有接口展示
    //获取所有的文件名称,含完整路径
    FILE::init($path)->getRawFiles();
    //获取所有的文件名称,不含路径
    FILE::init($path)->getFiles();
    //获取所有的文件夹名称,含完整路径
    FILE::init($path)->getRawDirs();
    //获取所有的文件夹名称,不含路径
    FILE::init($path)->getDirs();
    //获取目标文件夹$path的树形结构图
    FILE::init($path)->getTree();
    //获取目标文件夹$path的信息
    FILE::init($path)->getInfo();
    //把$path下的所有文件复制到$target目录下,如果有指定类型的情况下,那么只复制指定类型的文件
    FILE::init($path)->copyFiles($target, 'php');
    //把$path下的所有文件夹复制到$target目录下,并且按$path的层级摆放
    FILE::init($path)->copyDirs($target);
    //把$path下的所有文件剪切到$taret目录下,如果有指定类型的情况下,那么只移动指定类型的文件
    FILE::init($path)->moveFiles($target, 'php');
    //把$path下的所有文件及文件夹移动到$target目录下,并且不改变原有的层级结构
    FILE::init($path)->moveAll($target);
    //删除指定文件夹下的所有文件,不含文件夹
    FILE::init($path)->removeFiles();
    //删除指定路径下的所有内容含文件,文件夹
    FILE::init($path)->removeAll();
    ?>
  • 相关阅读:
    白盒测试相关技术图架构
    LoadRunner面试题
    调用标准API抓取错误信息
    请求的报的一般错误:One or more post-processing actions failed. Consult the OPP service log for details.
    xml publisher笔记
    CREATE_RECORD或者NEXT_RECORD导致 FRM-40102 错误:记录必须首先被输入或者删除
    国外博士论文下载
    数据挖掘网络资源集合
    十大数据挖掘算法
    (转)数据挖掘——我们能从股市数据得出什么,以及一些算法
  • 原文地址:https://www.cnblogs.com/rickyctbu/p/9978133.html
Copyright © 2011-2022 走看看