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
   modules/root/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
   | | | | | | |--
   | | | | | | | | `-- test_module.php
   | | | | | | |-- c
   | | | | | | | | `-- test_module.php
   | | | | | | `-- m
   | | | | | | `-- test_module.php
   | | | | `-- test_module
   | | | | |--
   | | | | | | `-- test_module.php
   | | | | |-- c
   | | | | | | `-- test_module.php
   | | | | `-- m
   | | | | `-- test_module.php
   | | |-- ルート
   | | | | |-- インデックス
   | | | | | | `-- c
   | | | | | | `-- index.php
   | | | | |-- モジュール
   | | | | | | |--
   | | | | | | | | `-- modules.php
   | | | | | | |-- c
   | | | | | | | | `-- modules.php
   | | | | | | `-- m
   | | | | | | `-- modules.php
   | | | | `-- ユーザー
   | | | | |--
   | | | | | | `-- user.php
   | | | | |-- c
   | | | | | | `-- user.php
   | | | | `-- m
   | | | | `-- user.php
   | | `-- テンプレート
   | | `-- ルート
   | | |-- デフォルト
   | | | | `-- 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

4 に答える 4

1

コマンドを見てくださいtouch

(コンテンツなしで)作成する必要のあるファイルのセットリストがある場合は、それを呼び出す配列を反復処理するだけです。

ファイル名の1次元配列を提供するには、コードを変更する必要があります。

$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 に答える
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 に答える
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 に答える