<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2022/8/10
 * Time: 18:39
 */

namespace file;


class DirHelper
{

    /**
     * 创建多级目录
     * @param $path [目录路径]
     * @return bool
     */
    public static function makeDir($path)
    {
        if (!file_exists($path)) {//不存在则建立
            $mk = @mkdir($path, 0777, true); //权限
            @chmod($path, 0777);
        }
        return true;
    }

    /**
     * 不经过回收站，递归删除文件夹（本机测试时请慎用）
     * @param $dir [目录路径]
     */
    public static function delDir($dir)
    {
        if (file_exists($dir)) {
            $mydir = dir($dir);
            while (false !== ($file = $mydir->read())) {
                if ($file != "." && $file != "..") {
                    $path = $dir . DS . $file;
                    is_dir($path) ? self::delDir($path) : @unlink($path);
                }
            }
            $mydir->close();
            @rmdir($dir);
        }
    }

    /**
     * 复制目录
     * @param $source [源目录路径]
     * @param $dest [目标目录路径]
     * @param $cover [拷贝并覆盖同名文件]
     */
    public static function copyDir($source, $dest, $cover = true)
    {
        if (!file_exists($dest)) self::makeDir($dest);
        $handle = opendir($source);
        while (($item = readdir($handle)) !== false) {
            if ($item == '.' || $item == '..') continue;
            $_source = $source . DS . $item;
            $_dest = $dest . DS . $item;
            if (is_dir($_source)) {
                self::copyDir($_source, $_dest, $cover);
            } else if (is_file($_source)) {
                if ($cover || (!$cover && !file_exists($_dest))) {
                    copy($_source, $_dest);
                }
            }
        }
        closedir($handle);
    }

    /**
     * 读取出一个文件夹及其子文件夹下所有文件
     * @param $path
     * @return array|mixed|string
     */
    public static function scanDirs($path)
    {
        global $result;
        $files = scandir($path);
        foreach ($files as $file) {
            if ($file != '.' && $file != '..') {
                if (is_dir($path . '/' . $file)) {
                    $result[] = $path . '/' . $file;
                    self::scanDirs($path . '/' . $file);
                } else {
                    $result[] = $path . '/' . $file;
                }
            }
        }
        return $result;
    }
}