测试代码
var_dump('cr=>', $docs->mkdir("g:\\qidizi/qidizi/1/2/3/4/5/./../../.././6"));exit;
输出
string(4) "cr=>"string(23) "g:/qidizi/qidizi/1/2/6/"
生成目录结果,并没有生成3,4,5这个目录
G:\qidizi\qidizi\1\2\6
创建window共享目录的方法
var_dump('cr=>', $docs->mkdir("//qidizi/qidizi/1/2/3/4/5/./../../.././6"));exit;
生成目录结果会是
\\QIDIZI\qidizi\1\2\6
------------方法代码----------------
/*
* 循环创建目录
* return:失败false, 成功返回绝对路径
* 注意/或是\起始的路径在window下被解析成当成php的盘符:/
* \\或//在window下被认为是共享路径,如果指定是共享路径,必须指定到目录级,不能只指定到机器名这级;
*/
public function mkdir($path = '', $mode = 0777) {
if (empty($path)) {
trigger_error('mkdir方法的path路径参数值必须指定', E_USER_ERROR);
return false;
}
$path = trim($path);
$path = preg_replace("/[\\\\\/]$/", '', $path);//移除最后的分隔符
$thisDir = str_replace("\\", '/', dirname(__FILE__)).'/';
$path = str_replace("\\", '/', $path);
$re = "/^\/\/[^\/]+\/[^\/]+\/?|^\/|^[a-z]\:\//i";
if (preg_match($re, $path, $root)) {//net driver \\serverName
$root = $root[0];
$path = substr($path, strlen($root));
} else {//relative
preg_match($re, $thisDir, $root);
$root = $root[0];
$path = substr($thisDir, strlen($root)) .$path;
}
$path = preg_replace("/\/{2,}/", '/', $path);// 把// 变成/
$pathc = explode('/', $path);
$cdir = $root;
$path = array();
if (!is_dir($cdir)) {//对于window //computer/sharfolder,is_dir('//computer')返回false,必须指定到目录,所以,对于//或是\\开始的目录,根目录必须是目录,不能是机器名
trigger_error($cdir. '根目录不存在', E_USER_ERROR);
return false;
}
foreach ($pathc as $f) {//移除 .与..,防止..导致创建了没用的目录后..向上引用
if ('.' == $f) {
continue;
} else if ('..' == $f) {
array_pop($path);
} else {
$path[] = $f;
}
}
foreach ($path as $f) {
$cdir .= ($root == $cdir ? '' : '/').$f;
if (is_dir($cdir)) {
continue;
}
if (!is_writable(dirname($cdir))) {
trigger_error($cdir. '目录不能创建,上级目录不允许写入', E_USER_ERROR);
return false;
}
if (!mkdir($cdir, $mode)) {
trigger_error($cdir. '目录创建出错', E_USER_ERROR);
return false;
}
}
return $cdir;
}