Php递归目录创建

时间:2012-12-30 20:26:57

标签: php file-io

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

   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);

感谢。

4 个答案:

答案 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;
    }