<?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;
}