我必须创建递归目录并为每个文件夹创建一个文件。我想这样:
modules/ modules/default modules/default/test_module modules/default/test_module/a modules/default/test_module/a/test_module.php modules/default/test_module/m modules/default/test_module/m/test_module.php modules/default/test_module/c modules/default/test_module/c/test_module.php modules/root modules/root/test_module modules/root/test_module/a modules/root/test_module/a/test_module.php modules/root/test_module/m modules/root/test_module/m/test_module.php modules/root/test_module/c modules/root/test_module/c/test_module.php templates templates/default templates/default/test_module templates/default/test_module/test_module.tpl templates/root templates/root/test_module templates/root/test_module/test_module.tpl
但是这段代码生成如下:
|-- modules | |-- default | | |-- root | | | `-- test_module | | | |-- a | | | | `-- test_module.php | | | |-- c | | | | `-- test_module.php | | | `-- m | | | `-- test_module.php | | `-- test_module | | |-- a | | | `-- test_module.php | | |-- c | | | `-- test_module.php | | `-- m | | `-- test_module.php | |-- root | | |-- index | | | `-- c | | | `-- index.php | | |-- modules | | | |-- a | | | | `-- modules.php | | | |-- c | | | | `-- modules.php | | | `-- m | | | `-- modules.php | | `-- user | | |-- a | | | `-- user.php | | |-- c | | | `-- user.php | | `-- m | | `-- user.php | `-- templates | `-- root | |-- default | | `-- test_module | | `-- test_module.tpl | `-- test_module | `-- test_module.tpl
代码是:
protected function createFiles($files, $parent_directory = null)
{
echo $parent_directory."\n</br>\n";
if (!$parent_directory) {
$parent_directory = www;
}
foreach ((array)$files as $key => $value) {
if (is_array($value)) {
if (!is_dir($parent_directory . $key)) {
mkdir($parent_directory . $key,0777);
chmod($parent_directory.$key,0777);
}
$parent_directory .= $key . '/';
$this->createFiles($value, $parent_directory);
} else {
$parent_directory_=$parent_directory.$key . '/';
if(!is_dir($parent_directory_)){
mkdir($parent_directory_,0777);
chmod($parent_directory_,0777);
}
$alias = explode('.',$value);
$alias = $alias[0];
$defaultAjaxContent = <<<AJAX
<?php
class {$alias} extends ajax{
/**
* Autocreated
**/
public function initAjax(){
}
}
?>
AJAX;
$file = fopen($parent_directory_.$value, 'w+');
$write = fwrite($file, $defaultAjaxContent);
if (!$write) {
throw new AjaxCatcher("{$parent_directory_}{$value} oluşturulurken beklenmedik bir hata oluştu. Lütfen tekrar deneyiniz. ");
}
}
}
//$file = fopen($files['default_ajax']);
return 1;
}
为什么不使用递归mkdir:
$dirs = array();
$dirs['modules']['default'][$alias]['a'] = $alias . ".php";
$dirs['modules']['default'][$alias]['m'] = $alias . '.php';
$dirs['modules']['default'][$alias]['c'] = $alias . '.php';
$dirs['modules']['root'][$alias]['a'] = $alias . '.php';
$dirs['modules']['root'][$alias]['m'] = $alias . '.php';
$dirs['modules']['root'][$alias]['c'] = $alias . '.php';
$dirs['templates']['root'][$alias] = $alias . '.tpl';
$dirs['templates']['default'][$alias] = $alias . '.tpl';
$this->createFiles($dirs);
感谢。
答案 0 :(得分:1)
我认为带有递归的mkdir仍然是最好的主意,你需要做的就是连接嵌套的数组键:
$dirs = array();
$dirs['modules']['default'][$alias]['a'] = $alias . ".php";
$dirs['modules']['default'][$alias]['m'] = $alias . '.php';
$dirs['modules']['default'][$alias]['c'] = $alias . '.php';
$dirs['modules']['root'][$alias]['a'] = $alias . '.php';
$dirs['modules']['root'][$alias]['m'] = $alias . '.php';
$dirs['modules']['root'][$alias]['c'] = $alias . '.php';
$dirs['templates']['root'][$alias] = $alias . '.tpl';
$dirs['templates']['default'][$alias] = $alias . '.tpl';
// concat the keys (flatten the array)...
function prefixKey($prefix, $array) {
$result = array();
foreach ($array as $key => $value) {
if (is_array($value)) {
$result = array_merge($result, prefixKey($prefix . $key . '/', $value));
} else {
$result[$prefix . $key] = $value;
}
}
return $result;
}
// this is your function, use the prefixKey function to get the required
// pathstructure directly from your array...
function createFiles($dirs) {
$pathStructure = prefixKey('', $dirs);
// here you have the flatten keys (the path), the value is the file
foreach($pathStructure as $path => $file) {
// use mkdir with
if(!is_dir($path)) {
mkdir($path, 0777, true);
}
// and so on
}
}
答案 1 :(得分:1)
查看命令touch
。
如果你有一组必须创建的文件列表(没有内容),你可以迭代调用它的数组。
您需要更改代码以提供文件名的单维数组。
$dirs = array();
$dirs[] = "modules\default\$alias\a\$alias.php";
...
$dirs[] = "templates\default\$alias\$alias.tpl";
foreach($dirs as $file) {
touch($file);
}
请注意,与权限相关的限制,如果您发现没有创建文件,请在触摸时阅读。
另外值得注意的是,您的示例中缺少fclose()
。您应该查看file_put_contents()
,因为它会为您处理fopen/fwrite/fclose
。
答案 2 :(得分:0)
你可以尝试
class Maker {
function createFiles($config, $path = null) {
foreach ( $config as $k => $v ) {
if (is_array($v)) {
mkdir($path . DIRECTORY_SEPARATOR . $k, 0777);
chmod($path . DIRECTORY_SEPARATOR . $k, 0777);
$this->createFiles($v,$path . DIRECTORY_SEPARATOR . $k);
}
else
{
touch($path . DIRECTORY_SEPARATOR . $v); //create the file
}
}
}
}
$alias = "test_module";
$dirs = array();
$dirs['modules']['default'][$alias]['a'] = $alias . ".php";
$dirs['modules']['default'][$alias]['m'] = $alias . '.php';
$dirs['modules']['default'][$alias]['c'] = $alias . '.php';
$dirs['modules']['root'][$alias]['a'] = $alias . '.php';
$dirs['modules']['root'][$alias]['m'] = $alias . '.php';
$dirs['modules']['root'][$alias]['c'] = $alias . '.php';
$dirs['templates']['root'][$alias] = $alias . '.tpl';
$dirs['templates']['default'][$alias] = $alias . '.tpl';
$maker = new Maker();
$maker->createFiles($dirs, __DIR__ . "/test");
答案 3 :(得分:0)
我的决心:
protected function createModuleFiles($alias){
//Default kısmına php controller dosyası oluşturulacak.
$dirs = array();
$dirs['modules/default/'.$alias.'/a'] = $alias . ".php";
$dirs['modules/default/'.$alias.'/m'] = $alias . '.php';
$dirs['modules/default/'.$alias.'/c'] = $alias . '.php';
$dirs['modules/root/'.$alias.'/a'] = $alias . '.php';
$dirs['modules/root/'.$alias.'/m'] = $alias . '.php';
$dirs['modules/root/'.$alias.'/c'] = $alias . '.php';
$dirs['templates/root/'.$alias] = $alias . '.tpl';
$dirs['templates/default/'.$alias] = $alias . '.tpl';
$this->createFiles($dirs);
}
protected function createFiles($files){
foreach($files as $key=>$value){
if(!is_dir($key)){
mkdir(www.$key,0777,true);
}
chmod(www.$key,0777);
$alias = explode('.',$value);
$alias = $alias[0];
$type = end(explode('/',$key));
switch($type){
case 'a';
case 'c';
case 'm';
$content = $this->default_contents($alias,$type);
break;
default:
$content = $this->default_contents($alias,'tpl');
break;
}
$file = fopen(www.$key.'/'.$value, 'w+');
$write = fwrite($file, $content);
if (!$write) {
throw new AjaxCatcher("".www.$key.'/'.$value." an error. ");
}
}
return 1;
}