servidor otro one mover img from files copiar archivos archivo another and php copy dir

otro - php copy img



Copia Recursiva de Directorio (14)

En mi antiguo VPS estaba usando el siguiente código para copiar los archivos y directorios dentro de un directorio a un nuevo directorio que se creó después de que el usuario envió su formulario.

function copyr($source, $dest) { // Simple copy for a file if (is_file($source)) { return copy($source, $dest); } // Make destination directory if (!is_dir($dest)) { mkdir($dest); $company = ($_POST[''company'']); } // Loop through the folder $dir = dir($source); while (false !== $entry = $dir->read()) { // Skip pointers if ($entry == ''.'' || $entry == ''..'') { continue; } // Deep copy directories if ($dest !== "$source/$entry") { copyr("$source/$entry", "$dest/$entry"); } } // Clean up $dir->close(); return true; } copyr(''Template/MemberPages'', "Members/$company")

Sin embargo, ahora en mi nuevo VPS solo creará el directorio principal, pero no copiará ninguno de los archivos en él. ¿No entiendo qué podría haber cambiado entre los 2 VPS?


¿Por qué no pedirle al OS que se encargue de esto?

system("cp -r olddir newdir");

Hecho.


Aquí hay una función recursiva simple para copiar directorios completos

fuente: http://php.net/manual/de/function.copy.php

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


El componente del sistema de archivos de Symfony ofrece un buen manejo de errores, así como la eliminación recursiva y otras cosas útiles. Usando la gran respuesta de @ OzzyCzech, podemos hacer una copia recursiva robusta de esta manera:

use Symfony/Component/Filesystem/Filesystem; // ... $fileSystem = new FileSystem(); if (file_exists($target)) { $this->fileSystem->remove($target); } $this->fileSystem->mkdir($target); $directoryIterator = new /RecursiveDirectoryIterator($source, /RecursiveDirectoryIterator::SKIP_DOTS); $iterator = new /RecursiveIteratorIterator($directoryIterator, /RecursiveIteratorIterator::SELF_FIRST); foreach ($iterator as $item) { if ($item->isDir()) { $fileSystem->mkdir($target . DIRECTORY_SEPARATOR . $iterator->getSubPathName()); } else { $fileSystem->copy($item, $target . DIRECTORY_SEPARATOR . $iterator->getSubPathName()); } }

Nota: puedes usar este componente así como todos los demás componentes de Symfony2 de forma independiente.


Esta función copia la carpeta de forma recursiva muy sólida. Lo he copiado de la sección de comentarios en el comando de copia de php.net

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


Esto es lo que usamos en nuestra empresa:

static public function copyr($source, $dest) { // recursive function to copy // all subdirectories and contents: if(is_dir($source)) { $dir_handle=opendir($source); $sourcefolder = basename($source); mkdir($dest."/".$sourcefolder); while($file=readdir($dir_handle)){ if($file!="." && $file!=".."){ if(is_dir($source."/".$file)){ self::copyr($source."/".$file, $dest."/".$sourcefolder); } else { copy($source."/".$file, $dest."/".$file); } } } closedir($dir_handle); } else { // can also handle simple copy commands copy($source, $dest); } }


He cambiado el código de Joseph (abajo), porque no estaba funcionando para mí. Esto es lo que funciona:

function cpy($source, $dest){ if(is_dir($source)) { $dir_handle=opendir($source); while($file=readdir($dir_handle)){ if($file!="." && $file!=".."){ if(is_dir($source."/".$file)){ if(!is_dir($dest."/".$file)){ mkdir($dest."/".$file); } cpy($source."/".$file, $dest."/".$file); } else { copy($source."/".$file, $dest."/".$file); } } } closedir($dir_handle); } else { copy($source, $dest); } }

[EDITAR] prueba agregada antes de crear un directorio (línea 7)


Hubo algunos problemas con las funciones que probé en el subproceso y aquí hay una función poderosa que cubre todo. Reflejos:

  1. No es necesario tener un directorio fuente inicial o intermedio. Se manejarán todos los directorios hasta el directorio de origen y los directorios copiados.

  2. Posibilidad de omitir directorios o archivos de una matriz. (Opcional) Con el global $skip; omitir archivos incluso en subniveles de directorios se manejan.

  3. Soporte recursivo completo, todos los archivos y directorios en profundidad múltiple son compatibles.

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


Intenta algo como esto:

$source = "dir/dir/dir"; $dest= "dest/dir"; mkdir($dest, 0755); foreach ( $iterator = new /RecursiveIteratorIterator( new /RecursiveDirectoryIterator($source, /RecursiveDirectoryIterator::SKIP_DOTS), /RecursiveIteratorIterator::SELF_FIRST) as $item ) { if ($item->isDir()) { mkdir($dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName()); } else { copy($item, $dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName()); } }

El iterador itera a través de todas las carpetas y subcarpetas y hace una copia de los archivos de $source a $dest


OzzyCheck es elegante y original, pero olvidó el mkdir inicial ($ dest); Vea abajo. Ningún comando de copia se proporciona solo con contenido. Debe cumplir con todo su papel.

$source = "dir/dir/dir"; $dest= "dest/dir"; mkdir($dest, 0755); foreach ( $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::SELF_FIRST) as $item) { if ($item->isDir()) { mkdir($dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName()); } else { copy($item, $dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName()); } }


Podría sugerir que (asumiendo que es un * nix VPS) que simplemente haga una llamada al sistema a cp -r y deje que eso haga la copia por usted.


Supongo que deberías comprobar los derechos de usuario (grupo). Debería considerar chmod, por ejemplo, dependiendo de cómo ejecute (su?) PHP. También puede elegir modificar la configuración de php .


hmm como eso es complicado))

function mkdir_recursive( $dir ){ $prev = dirname($dir); if( ! file_exists($prev)) { mkdir_recursive($prev); } if( ! file_exists($dir)) { mkdir($dir); } } ... foreach( $files as $file){ mkdir_recursive( dirname( $dir_d . $file)); copy( $dir_s . $file, $dir_d . $file); }

$file - algo como eso www/folder/ahah/file.txt


function recurse_copy($source, $dest) { // 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); } // Loop through the folder $dir = dir($source); while (false !== $entry = $dir->read()) { // Skip pointers if ($entry == ''.'' || $entry == ''..'') { continue; } // Deep copy directories recurse_copy("$source/$entry", "$dest/$entry"); } // Clean up $dir->close(); return true; }


<?php /** * code by Nk ([email protected]) */ class filesystem { public static function normalizePath($path) { return $path.(is_dir($path) && !preg_match(''@/$@'', $path) ? ''/'' : ''''); } public static function rscandir($dir, $sort = SCANDIR_SORT_ASCENDING) { $results = array(); if(!is_dir($dir)) return $results; $dir = self::normalizePath($dir); $objects = scandir($dir, $sort); foreach($objects as $object) if($object != ''.'' && $object != ''..'') { if(is_dir($dir.$object)) $results = array_merge($results, self::rscandir($dir.$object, $sort)); else array_push($results, $dir.$object); } array_push($results, $dir); return $results; } public static function rcopy($source, $dest, $destmode = null) { $files = self::rscandir($source); if(empty($files)) return; if(!file_exists($dest)) mkdir($dest, is_int($destmode) ? $destmode : fileperms($source), true); $source = self::normalizePath(realpath($source)); $dest = self::normalizePath(realpath($dest)); foreach($files as $file) { $file_dest = str_replace($source, $dest, $file); if(is_dir($file)) { if(!file_exists($file_dest)) mkdir($file_dest, is_int($destmode) ? $destmode : fileperms($file), true); } else copy($file, $file_dest); } } } ?>

/var/www/websiteA/backup.php:

<?php /* include.. */ filesystem::rcopy(''/var/www/websiteA/'', ''../websiteB''); ?>