PHP 递归浏览目录 | 递归删除目录 | 浏览当前目录

方文锋  2020-03-30 08:32:27  922  首页学习PHP

<?php
/**
 * 是否是字符串
 * @param string|int|double $str
 * @return bool
 */
function y_string($str = '')
{
    return !in_array($str, array('', null, false), true) && (is_string($str) || is_numeric($str));
}

/**
 * 递归浏览目录
 * @param array $arr
 * @param string $dir 相对路径和以‘/’开头的路径,路径里尽量不要包含 ‘../’
 * @param string $root_dir 根目录,绝对路径,可以忽略
 * @param boolean $previous_dir $dir里路径是否允许包含‘../’
 * @return array|bool
 */
function dir_read(&$arr = array(), $dir = '', $root_dir = '', $previous_dir = false)
{
    if (y_string($dir)) {
        $is_relative = strpos($dir, '/') === 0; //以‘/’开头的路径
        $no_absolute = preg_match("/^(?!([A-Za-z]{1,3}\:))/i", $dir); //不是绝对路径(window系统下)
        if (y_string($root_dir) && ($root_dir = realpath($root_dir))) {
            if ($is_relative) {
                $dir = rtrim($root_dir, '\\/') . $dir;
            } elseif ($no_absolute) {
                $dir = rtrim($root_dir, '\\/') . "/$dir";
            }
            $self_dir = $root_dir;
        } else {
            if ($is_relative) {
                if ($_SERVER['DOCUMENT_ROOT']) {
                    $dir = ($self_dir = rtrim($_SERVER['DOCUMENT_ROOT'], '\\/')) . $dir;
                } else {
                    $dir = ($self_dir = getcwd()) . $dir;
                }
            } elseif ($no_absolute) {
                $dir = ($self_dir = getcwd()) . "/$dir";
            }
        }
    } else {
        $self_dir = $dir = y_string($root_dir) ? $root_dir : getcwd();
    }
    $previous_dir || ($dir = str_replace(array('../', '..\\'), array('', ''), $dir)); //不允许路径包含‘../’
    $dir = realpath($dir);
    if ($dir) {
        $dir = rtrim(preg_replace("/[\/\\\\]{1,}/", "/", $dir), '/') . '/';
        $self_dir = rtrim(preg_replace("/[\/\\\\]{1,}/", "/", $self_dir), '/'); //相对目录的根目录
        $_dir = rtrim(str_replace($self_dir, '/', $dir), '/') . '/'; //以‘/’开头的相对路径

        $dir_handle = opendir($dir);
        $preg = array("a" => "/[\/\\\\]{1,10}/i");
        while (false !== $list = readdir($dir_handle)) {
            if ($list == '.' || $list == '..') continue;
            $file_path = preg_replace($preg['a'], "/", $dir . $list, -1);
            $relative_path = preg_replace($preg['a'], '/', $_dir . $list, -1);
            if (is_file($file_path)) {
                $arr['file'][] = array(
                    /*绝对路径(完整的文件路径)*/
                    "path" => $file_path,
                    /*相对路径*/
                    "relative" => $relative_path,
                    /*文件名*/
                    "fileName" => $list,
                    /*文件创建或修改时间*/
                    "filectime" => filectime($file_path),
                    "fctime" => date("Y-m-d H:i:s", filectime($file_path)),
                    /*文件的上次访问时间*/
                    "fileatime" => fileatime($file_path),
                    "fatime" => date("Y-m-d H:i:s", fileatime($file_path)),
                    /*文件的内容上次被修改的时间*/
                    "filemtime" => filemtime($file_path),
                    "fmtime" => date("Y-m-d H:i:s", filemtime($file_path)),
                    /*文件的所有者*/
                    "fileowner" => fileowner($file_path),
                    /*文件的大小 byte(字节)*/
                    "filesize" => filesize($file_path),
                );
            }
            //判断当前是否为目录
            if (is_dir($file_path)) {
                //是目录
                $arr["dir"][] = array(
                    /*完整目录路径(决对路径)*/
                    "path" => $file_path,
                    /*相对路径*/
                    "relative" => $relative_path,
                    /*文件夹(目录)名称*/
                    "dirName" => $list,
                );
                dir_read($arr, $_dir . '/' . $list, $root_dir);
            }
        }
        closedir($dir_handle);
        return $arr;
    } else {
        return false;
    }
}

/**
 * 递归浏览目录
 * @param string $dir
 * @param string $root_dir
 * @param bool $previous_dir
 * @return array|bool
 */
function readDirs($dir = '', $root_dir = '', $previous_dir = false)
{
    //static $arr = array();
    return dir_read($arr, $dir, $root_dir, $previous_dir);
}

/**
 * 遍历删除目录和目录下所有文件
 * @param $dir
 * @return bool
 */
function del_dir($dir)
{
    if (!is_dir($dir)) {
        return false;
    }
    $handle = opendir($dir);
    while (($file = readdir($handle)) !== false) {
        if ($file != "." && $file != "..") {
            is_dir("$dir/$file") ? del_dir("$dir/$file") : @unlink("$dir/$file");
        }
    }
    if (readdir($handle) == false) {
        closedir($handle);
        @rmdir($dir);
    }
}

/**
 * 自定义目录扫描
 * @param string $path
 * @return array|bool
 */
function my_scandir($path = '')
{
    if (y_string($path) && ($path = realpath($path))) {
        $list = scandir($path);
        $path = rtrim(str_replace('\\', '/', $path), '/') . '/';
        if (is_array($list)) {
            $temp = array("file" => array(), "dir" => array());
            foreach ($list as $val) {
                if ($val != "." && $val != "..") {
                    $link = $path . $val;
                    $od = array(
                        'path' => $link, 'fileowner' => fileowner($link), 'filesize' => filesize($link), 'filectime' => date('Y-m-d H:i:s', filectime($link)),
                        'fileatime' => date('Y-m-d H:i:s', fileatime($link)), 'filemtime' => date('Y-m-d H:i:s', filemtime($link)),
                    );
                    if (is_dir($link)) {
                        unset($od['fileowner'],$od['filesize']);
                        $temp['dir'][] = array_merge(array('dirName' => $val), $od);
                    }
                    if (is_file($link)) {
                        $temp['file'][] = array_merge(array('fileName' => $val), $od);
                    }
                }
            }
            return $temp;
        }
    }
    return false;
}