php循环创建目录的函数代码
php创建目录功能
/**
* 创建目录
* @param string $path 目录路径
* @return boolean|string
*/
function makeDir($path) {
$path = str_replace(array('/', '\\', '//', '\\\\'), DIRECTORY_SEPARATOR, $path);
$dirs = explode(DIRECTORY_SEPARATOR, $path);
$tmp = '';
foreach ($dirs as $dir) {
$tmp .= $dir . DIRECTORY_SEPARATOR;
if (!file_exists($tmp) && !mkdir($tmp, 0777)) {
return $tmp;
}
}
return true;
}以上程序绝大多数没有问题,但是在部分安全要求严格的服务器上,就会产生问题。
例如,假设需要创建 D:\server\www\temp 目录,如果网站没有D盘的读取权限,则file_exists就会返回false,于是程序尝试去创建D盘目录,显然这不是我们期望的。我建议的做法,就是替换掉网站根路径,不管传进来的参数有没包含根路径,在判断目录是否存在和创建目录时再加上网站根路径。改良后的代码:
function makeDir($path) {
$path = str_replace(array('/', '\\', '//', '\\\\'), DIRECTORY_SEPARATOR, $path);
$path = str_replace(ROOT_PATH, '', $path); //替换网站根路径, ROOT_PATH 通常可以在配置文件里定义
$dirs = explode(DIRECTORY_SEPARATOR, $path);
$relativePath = '';
foreach ($dirs as $dir) {
if ($dir) {
$relativePath .= $dir . DIRECTORY_SEPARATOR;
$realPath = ROOT_PATH . $relativePath;
if (!file_exists($realPath) && !@mkdir($realPath, 0777)) {
return $realPath;
}
}
}
return true;
}ROOT_PATH 定义:
[php] view plaincopy
define('ROOT_PATH', __DIR__ . DIRECTORY_SEPARATOR);调用:
makeDir('upload/2012/11/12');//或者 makeDir(ROOT_PATH . 'upload/2012/11/12');