Были некоторые проблемы с функциями, которые я тестировал в потоке, и вот мощная функция, которая охватывает все. Основные характеристики:
Нет необходимости иметь начальные или промежуточные исходные каталоги. Все каталоги, вплоть до исходного каталога и скопированных каталогов, будут обработаны.
Возможность пропускать каталог или файлы из массива. (необязательно) При global $skip;
обработка файлов даже в каталогах подуровня обрабатывается.
Полная рекурсивная поддержка, поддерживаются все файлы и каталоги в нескольких глубинах.
$from = "/path/to/source_dir";
$to = "/path/to/destination_dir";
$skip = array('some_file.php', 'somedir');
copy_r($from, $to, $skip);
function copy_r($from, $to, $skip=false) {
global $skip;
$dir = opendir($from);
if (!file_exists($to)) {mkdir ($to, 0775, true);}
while (false !== ($file = readdir($dir))) {
if ($file == '.' OR $file == '..' OR in_array($file, $skip)) {continue;}
if (is_dir($from . DIRECTORY_SEPARATOR . $file)) {
copy_r($from . DIRECTORY_SEPARATOR . $file, $to . DIRECTORY_SEPARATOR . $file);
}
else {
copy($from . DIRECTORY_SEPARATOR . $file, $to . DIRECTORY_SEPARATOR . $file);
}
}
closedir($dir);
}