3
    $base = dirname(__FILE__).'/themes/';
    $target = dirname( STYLESHEETPATH ).'/';
    $directory_folders = new DirectoryIterator($base); 
    foreach ($directory_folders as $folder) 
    {
        if (!$folder->isDot())           {

            echo '<p>source: '.$folder->getRealPath();
            //returns: C:\xampplite\htdocs\test\wp-content\plugins\test\themes\testtheme-1

            echo '<br>target: '.$target;
            //returns: C:\xampplite\htdocs\test/wp-content/themes/

            copy($folder->getRealPath(), $target);
            //returns: Error. The first argument to copy() function cannot be a directory
         }
    }die;

更新:Pascalの提案された答えについて、これが私の修正されたコードです。これは機能します。

function recurse_copy(){
    $src = dirname(__FILE__).'/themes/';
    $dst = dirname( STYLESHEETPATH ).'/';

    $dir = opendir($src); 
    @mkdir($dst); 
    while(false !== ( $file = readdir($dir)) ) 
    { 
        if (( $file != '.' ) && ( $file != '..' )) 
        { 
            if ( is_dir($src . '/' . $file) ) { 
                recurse_copy_recurse($src . '/' . $file,$dst . '/' . $file); 
            } 
            else { 
                copy($src . '/' . $file,$dst . '/' . $file); 
            } 
        } 
    } 
    closedir($dir); 
}


function recurse_copy_recurse($src,$dst){

    $dir = opendir($src); 
    @mkdir($dst); 
    while(false !== ( $file = readdir($dir)) ) 
    { 
        if (( $file != '.' ) && ( $file != '..' )) 
        { 
            if ( is_dir($src . '/' . $file) ) { 
                recurse_copy_recurse($src . '/' . $file,$dst . '/' . $file); 
            } 
            else { 
                copy($src . '/' . $file,$dst . '/' . $file); 
            } 
        } 
    } 
    closedir($dir); 
}
4

2 に答える 2

10

いいえ、copy()関数は再帰的ではありません。フォルダーとその内容をコピーすることはできません。


しかし、そのマニュアル ページのユーザー ノートを見ると、再帰的な実装の提案がいくつか見つかります。

たとえば、gimmicklessgpt (彼の投稿を引用)によって提案された再帰関数は 次のとおりです。

<?php
function recurse_copy($src,$dst) {
    $dir = opendir($src);
    @mkdir($dst);
    while(false !== ( $file = readdir($dir)) ) {
        if (( $file != '.' ) && ( $file != '..' )) {
            if ( is_dir($src . '/' . $file) ) {
                recurse_copy($src . '/' . $file,$dst . '/' . $file);
            }
            else {
                copy($src . '/' . $file,$dst . '/' . $file);
            }
        }
    }
    closedir($dir);
}
?>



質問の編集後に編集:

パラメータを渡して関数を呼び出しています:

recurse_copy($src . '/' . $file,$dst . '/' . $file); 

しかし、あなたの関数はパラメータを取らないと定義されています:

function recurse_copy(){
    $src = dirname(__FILE__).'/themes/';
    $dst = dirname( STYLESHEETPATH ).'/';
    ...

関数の定義を修正して、パラメーターを受け取るようにし、それら$src$dst関数内で初期化するのではなく、最初の呼び出しで初期化する必要があります。

于 2011-03-24T19:06:42.707 に答える
2

はい、ディレクトリにすることはできません。ディレクトリ
をコピーするための答えについては、こちらをご覧ください:-)

于 2011-03-24T19:03:30.523 に答える