delirehberi
delirehberi

Reputation: 522

Php recursive directory creation

I must create recursive directories and create a file for every folder. I want like this:

   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

But this code generate like this:

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

Code is:

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

Reason why not use recursive 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);

thanks.

Upvotes: 3

Views: 331

Answers (4)

delirehberi
delirehberi

Reputation: 522

My resolve :

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

Upvotes: 0

Baba
Baba

Reputation: 95121

You can try

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

Upvotes: 0

hafichuk
hafichuk

Reputation: 10781

Take a look at the command touch.

If you have a set list of files that you must create (with no contents), you can just iterate over your array calling it.

You will need to change your code to supply a single dimensional array of file names.

$dirs = array();
$dirs[] = "modules\default\$alias\a\$alias.php";
...
$dirs[] = "templates\default\$alias\$alias.tpl";

foreach($dirs as $file) {
    touch($file);
}

Note that there are permission related restrictions, so read up on touch if you find the files are not being created.

Also of note, you are missing fclose() in your example. You should look into file_put_contents() as it handles the fopen/fwrite/fclose for you.

Upvotes: 1

axel.michel
axel.michel

Reputation: 5764

I think the mkdir with recursive is still the best idea, all you need to do is to concat the nested array keys:

    $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
       }

    }

Upvotes: 1

Related Questions