使用PHP将目录的全部内容复制到另一个目录
我试图将目录的全部内容复制到另一个位置使用
copy ("old_location/*.*","new_location/");
但它表示找不到stream,找不到真*.*
。
任何其他方式
谢谢戴夫
看来,副本只处理单个文件 。 这里是一个复制文档页面上的本笔记中recursion复制的函数:
<?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命令都会recursion地拷贝 – 所以最快的解决scheme就是将其拷贝出来并使用它们。 例如
`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
模式复制,请使用glob
确定文件,然后运行复制。 这不会复制子目录,也不会创build目标目录。
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
非常感谢费利克斯·克林(Felix Kling),他在我的代码中非常感激地使用了他的出色答案。 我提供了一个布尔返回值的小增强来报告成功或失败:
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的答案。 谢谢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(); } }