Я попытался скопировать все содержимое каталога в другое место, используя
copy ("old_location/*.*","new_location/");
но он говорит, что не может найти поток, true *.*
не найден.
Любым другим путем
Спасибо Дэйву
Кажется, что копия обрабатывает только отдельные файлы . Вот функция для рекурсивного копирования, которую я нашел в этой заметке на странице документации копирования :
<?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); } ?>
Как описано здесь , это еще один подход, который также заботится о символических ссылках:
/** * Copy a file, or recursively copy a folder and its contents * @author Aidan Lister <aidan@php.net> * @version 1.0.1 * @link http://aidanlister.com/2004/04/recursively-copying-directories-in-php/ * @param string $source Source path * @param string $dest Destination path * @param int $permissions New folder creation permissions * @return bool Returns true on success, false on failure */ function xcopy($source, $dest, $permissions = 0755) { // Check for symlinks if (is_link($source)) { return symlink(readlink($source), $dest); } // Simple copy for a file if (is_file($source)) { return copy($source, $dest); } // Make destination directory if (!is_dir($dest)) { mkdir($dest, $permissions); } // Loop through the folder $dir = dir($source); while (false !== $entry = $dir->read()) { // Skip pointers if ($entry == '.' || $entry == '..') { continue; } // Deep copy directories xcopy("$source/$entry", "$dest/$entry", $permissions); } // Clean up $dir->close(); return true; }
copy () работает только с файлами.
Как копия DOS, так и команды Unix cp будут копировать рекурсивно – поэтому самое быстрое решение – это просто выложить и использовать их. например
`cp -r $src $dest`;
В противном случае вам нужно будет использовать opendir
/ readdir
или scandir
для чтения содержимого каталога, повторения результатов и если is_dir возвращает true для каждого из них, запишите его.
например
function xcopy($src, $dest) { foreach (scandir($src) as $file) { if (!is_readable($src . '/' . $file)) continue; if (is_dir($src .'/' . $file) && ($file != '.') && ($file != '..') ) { mkdir($dest . '/' . $file); xcopy($src . '/' . $file, $dest . '/' . $file); } else { copy($src . '/' . $file, $dest . '/' . $file); } } }
Лучшее решение!
<?php $src = "/home/www/domain-name.com/source/folders/123456"; $dest = "/home/www/domain-name.com/test/123456"; shell_exec("cp -r $src $dest"); echo "<H3>Copy Paste completed!</H3>"; //output when done ?>
function full_copy( $source, $target ) { if ( is_dir( $source ) ) { @mkdir( $target ); $d = dir( $source ); while ( FALSE !== ( $entry = $d->read() ) ) { if ( $entry == '.' || $entry == '..' ) { continue; } $Entry = $source . '/' . $entry; if ( is_dir( $Entry ) ) { full_copy( $Entry, $target . '/' . $entry ); continue; } copy( $Entry, $target . '/' . $entry ); } $d->close(); }else { copy( $source, $target ); } }
<?php function copy_directory( $source, $destination ) { if ( is_dir( $source ) ) { @mkdir( $destination ); $directory = dir( $source ); while ( FALSE !== ( $readdirectory = $directory->read() ) ) { if ( $readdirectory == '.' || $readdirectory == '..' ) { continue; } $PathDir = $source . '/' . $readdirectory; if ( is_dir( $PathDir ) ) { copy_directory( $PathDir, $destination . '/' . $readdirectory ); continue; } copy( $PathDir, $destination . '/' . $readdirectory ); } $directory->close(); }else { copy( $source, $destination ); } } ?>
с последней четвертой строки, сделайте это
$source = 'wordpress';//ie your source path
а также
$destination ='b';
Как и в другом месте, copy
работает только с одним файлом для источника, а не с шаблоном. Если вы хотите скопировать по шаблону, используйте glob
для определения файлов, а затем запустите копию. Это не будет копировать подкаталоги, хотя и не создаст целевой каталог.
function copyToDir($pattern, $dir) { foreach (glob($pattern) as $file) { if(!is_dir($file) && is_readable($file)) { $dest = realpath($dir . DIRECTORY_SEPARATOR) . basename($file); copy($file, $dest); } } } copyToDir('./test/foo/*.txt', './test/bar'); // copies all txt files
Полная благодарность должна зайти в Феликс Клинг за его отличный ответ, который я с благодарностью использовал в своем коде. Я предлагаю небольшое повышение логической возвращаемой ценности для отчета об успехе или неудаче:
function recurse_copy($src, $dst) { $dir = opendir($src); $result = ($dir === false ? false : true); if ($result !== false) { $result = @mkdir($dst); if ($result === true) { while(false !== ( $file = readdir($dir)) ) { if (( $file != '.' ) && ( $file != '..' ) && $result) { if ( is_dir($src . '/' . $file) ) { $result = recurse_copy($src . '/' . $file,$dst . '/' . $file); } else { $result = copy($src . '/' . $file,$dst . '/' . $file); } } } closedir($dir); } } return $result; }
Моя обрезанная версия @ Kzoty отвечает. Спасибо, Кзоты.
Применение
Helper::copy($sourcePath, $targetPath); class Helper { static function copy($source, $target) { if (!is_dir($source)) {//it is a file, do a normal copy copy($source, $target); return; } //it is a folder, copy its files & sub-folders @mkdir($target); $d = dir($source); $navFolders = array('.', '..'); while (false !== ($fileEntry=$d->read() )) {//copy one by one //skip if it is navigation folder . or .. if (in_array($fileEntry, $navFolders) ) { continue; } //do copy $s = "$source/$fileEntry"; $t = "$target/$fileEntry"; self::copy($s, $t); } $d->close(); } }