subir - Copie todo el contenido de un directorio a otro usando php
php copiar archivo de un servidor a otro (10)
Como se describe aquí , este es otro enfoque que también se ocupa de los enlaces simbólicos:
/**
* Copy a file, or recursively copy a folder and its contents
* @author Aidan Lister <[email protected]>
* @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;
}
Traté de copiar todo el contenido del directorio a otra ubicación usando
copy ("old_location/*.*","new_location/");
pero dice que no puede encontrar la transmisión, verdadero *.*
no se encuentra.
Cualquier otra manera
Gracias Dave
Como se dijo en otro lugar, la copy
solo funciona con un único archivo como fuente y no como un patrón. Si desea copiar por patrón, use glob
para determinar los archivos, luego ejecute copy. Sin embargo, esto no copiará los subdirectorios ni creará el directorio de destino.
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
Copio todo el directorio por SPL Directory Iterator.
function recursiveCopy($source, $destination)
{
if (!file_exists($destination)) {
mkdir($destination);
}
$splFileInfoArr = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);
foreach ($splFileInfoArr as $fullPath => $splFileinfo) {
//skip . ..
if (in_array($splFileinfo->getBasename(), [".", ".."])) {
continue;
}
//get relative path of source file or folder
$path = str_replace($source, "", $splFileinfo->getPathname());
if ($splFileinfo->isDir()) {
mkdir($destination . "/" . $path);
} else {
copy($fullPath, $destination . "/" . $path);
}
}
}
#calling the function
recursiveCopy(__DIR__ . "/source", __DIR__ . "/destination");
Gracias a Félix Kling por su excelente respuesta que utilicé con gratitud en mi código. Ofrezco una pequeña mejora de un valor de retorno booleano para informar de éxito o fracaso:
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;
}
La mejor solución es!
<?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
?>
Mi versión podada de @Kzoty responde. Gracias Kzoty.
Uso
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();
}
}
Parece que copiar solo maneja archivos individuales . Aquí hay una función para copiar recursivamente que encontré en esta nota en la página de documentación de copia :
<?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 () solo funciona con archivos.
Tanto la copia de DOS como los comandos de Unix cp se copiarán de forma recursiva, por lo que la solución más rápida es simplemente desembolsarlos y usarlos. p.ej
`cp -r $src $dest`;
De lo contrario, necesitará usar el opendir
/ readdir
o scandir
para leer el contenido del directorio, repetir los resultados y si is_dir devuelve verdadero para cada uno, recurse en él.
p.ej
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
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 );
}
}
?>
de la última 4ta línea, hazlo
$source = ''wordpress'';//i.e. your source path
y
$destination =''b'';
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 );
}
}