我在codeigniter中使用此函数,只有在它们不存在时才尝试检查和创建目录和子目录。仅生成k_uploads,但在主目录'k_upoloads'中创建子目录时发生错误。结构应该是
k_uploads (main directory)
-2012 (subdirectory in main directory - made per year in k_uploads)
-Jan(subdirectory in 2012 - made every month in 2012)
-subdirx (subdirectory in Jan - holds the excel files for that month)
xxyyy.xlsx (month files in subdirx)
应创建每年和每月的目录和子目录。我不知道问题在哪里,它适用于普通的PHP,但不适用于codeigniter。
public function makeDir(){
$labref = $this->uri->segment(3);
$dirName='k_uploads';
echo $store_dir= date('Y').'/'.date('M').'/'.$subdirx;
if(!is_dir($dirName))
$k= mkdir($dirName, 0777);
if($k){
echo $dirName. 'dir has been created';
}else{
echo 'An error occured';
}
if(is_dir($dirName))
$w= mkdir($store_dir,0777);
if($w){
echo $sore_dir. 'subdirs have been created';
}else{
echo 'An error occured';
}
}
答案 0 :(得分:1)
mkdir
有一个可以设置的递归标志。这将创建完整的路径。见PHP: mkdir
所以你应该使用mkdir($store_dir,0777, true)
该功能可能如下所示:
public function makeDir(){
$subdirx = $this->uri->segment(3);
$store_dir= APPPATH . 'k_uploads/' . date('Y').'/'.date('M').'/'.$subdirx;
if(!is_dir($store_dir)) {
return mkdir($dirName, 0777, true);
} else {
return true;
}
}
答案 1 :(得分:0)
为了做到这一点,您需要在序列中创建每个子目录,因为PHP不会为您执行此操作。您可能希望在执行此操作时使用is_dir()
检查目录是否已存在。
以下是一个例子:
function createDir($dirToMake) {
$root = "/home/sites/test/www/";
$dArray = explode("/",$dirToMake);
if (file_exists($root) && is_dir($root)) {
// just a quick check
if (substr($root,0,-1) !== "/") $root .= "/";
foreach ($dArray as $v) {
if (strlen($v) == 0) continue;
$root = $root.$v."/";
if (file_exists($root) && is_dir($root)) continue;
mkdir($root);
}
}
else throw new Exception("Root directory does not exist");
}
此函数还允许通常的错误(//作为其中之一),并且将循环执行,如果它不存在则创建所需的子目录体系结构。