3

我必须创建递归目录并为每个文件夹创建一个文件。我想要这样:

   模块/
   模块/默认
   模块/默认/test_module
   模块/默认/test_module/a
   模块/默认/test_module/a/test_module.php
   模块/默认/test_module/m
   模块/默认/test_module/m/test_module.php
   模块/默认/test_module/c
   模块/默认/test_module/c/test_module.php
   模块/根
   模块/根/test_module
   模块/根/test_module/a
   模块/根/test_module/a/test_module.php
   模块/根/test_module/m
   模块/根/test_module/m/test_module.php
   模块/根/test_module/c
   模块/根/test_module/c/test_module.php
   模板
   模板/默认
   模板/默认/test_module
   模板/默认/test_module/test_module.tpl
   模板/根
   模板/根/test_module
   模板/根/test_module/test_module.tpl

但是这段代码生成如下:

   |-- 模块
   | |-- 默认
   | | |-- 根
   | | | `-- 测试模块
   | | | |-- 一个
   | | | | `-- test_module.php
   | | | |-- c
   | | | | `-- test_module.php
   | | | `--米
   | | | `-- test_module.php
   | | `-- 测试模块
   | | |-- 一个
   | | | `-- test_module.php
   | | |-- c
   | | | `-- test_module.php
   | | `--米
   | | `-- test_module.php
   | |-- 根
   | | |-- 索引
   | | | `--c
   | | | `-- index.php
   | | |-- 模块
   | | | |-- 一个
   | | | | `--modules.php
   | | | |-- c
   | | | | `--modules.php
   | | | `--米
   | | | `--modules.php
   | | `-- 用户
   | | |-- 一个
   | | | `-- 用户.php
   | | |-- c
   | | | `-- 用户.php
   | | `--米
   | | `-- 用户.php
   | `-- 模板
   | `-- 根
   | |-- 默认
   | | `-- 测试模块
   | | `-- test_module.tpl
   | `-- 测试模块
   | `-- 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);

谢谢。

4

4 回答 4

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
       }

    }
于 2012-12-30T20:50:21.953 回答
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问题。

于 2012-12-30T20:54:30.950 回答
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");
于 2012-12-30T20:55:35.090 回答
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;
    }
于 2013-01-02T15:54:11.473 回答