2011-03-24 5 views
0
$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; 

ОБНОВЛЕНИЕ: В предлагаемом ответе Паскаля, вот мой измененный код. Это работает.Первый аргумент функции copy() не может быть каталогом?

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

ответ

5

Нет, функция copy() не является рекурсивным: он не может копировать папки и их содержимое.


Но если вы посмотрите на ПРИНИМАЕШЬ к пользователей на игровом этой странице руководства, вы найдете некоторые предложения рекурсивных реализаций.

Например, here's a recursive function proposed by 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); 
} 
?> 



Edit после редактирования вопроса:

Вы вызываете вашу функцию передавая его параметры:

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

Но ваша функция определяется как не принимая параметра:

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

Вы должны исправить определение вашей функции, поэтому она принимает параметры - и не инициализировать тех $src и $dst внутри функции, но его первый звонок.

+0

спасибо! Работает в обаянии. +1 для быстрой справки и справки. –

+0

@Scott приветствую :-) * (Я отредактировал свой ответ с дополнительной заметкой о вашей рекурсивной функции) * –

+0

Да, я понял ошибку сразу после того, как обновил свой вопрос. Вы, должно быть, видели это, прежде чем я исправил его :-) –

Смежные вопросы