mover todos los archivos de una carpeta a otra?


Cuando muevo un archivo de una ubicación a otra utilizo

rename('path/filename', 'newpath/filename');

¿Cómo se mueven todos los archivos de una carpeta a otra carpeta? probé este sin resultado:

rename('path/*', 'newpath/*');
 26
Author: Havelock, 2010-01-17

9 answers

Una solución ligeramente detallada:

// Get array of all source files
$files = scandir("source");
// Identify directories
$source = "source/";
$destination = "destination/";
// Cycle through all source files
foreach ($files as $file) {
  if (in_array($file, array(".",".."))) continue;
  // If we copied this successfully, mark it for deletion
  if (copy($source.$file, $destination.$file)) {
    $delete[] = $source.$file;
  }
}
// Delete all successfully-copied files
foreach ($delete as $file) {
  unlink($file);
}
 52
Author: Sampson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-22 17:01:27

Una alternativa usando rename () y con alguna comprobación de errores:

$srcDir = 'dir1';
$destDir = 'dir2';

if (file_exists($destDir)) {
  if (is_dir($destDir)) {
    if (is_writable($destDir)) {
      if ($handle = opendir($srcDir)) {
        while (false !== ($file = readdir($handle))) {
          if (is_file($srcDir . '/' . $file)) {
            rename($srcDir . '/' . $file, $destDir . '/' . $file);
          }
        }
        closedir($handle);
      } else {
        echo "$srcDir could not be opened.\n";
      }
    } else {
      echo "$destDir is not writable!\n";
    }
  } else {
    echo "$destDir is not a directory!\n";
  }
} else {
  echo "$destDir does not exist\n";
}
 15
Author: GreenMatt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-17 19:59:23

Por favor, pruebe esta solución, se ha probado con éxito::

<?php
  $files = scandir("f1");
  $oldfolder = "f1/";
  $newfolder = "f2/";
  foreach($files as $fname) {
      if($fname != '.' && $fname != '..') {
          rename($oldfolder.$fname, $newfolder.$fname);
      }
  }
?>
 11
Author: Lakhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-28 12:59:36

Así que traté de usar la función rename() como se describe y seguí recibiendo el error que había no such file or directory. Coloqué el código dentro de una sentencia if else para asegurarme de que realmente tenía los directorios creados. Se veía así:

$tempDir = '/home/site/images/tmp/';
$permanentDir = '/home/site/images/' . $claimid; // this was stored above
mkdir($permanentDir,0775);
if(is_dir($permanentDir)){
    echo $permanentDir . ' is a directory';
    if(is_dir($tempDir)){
        echo $tempDir . ' is a directory';
    }else{
        echo $tempDir . ' is not a directory';
    }
}else{
    echo $permanentDir . ' is not a directory';
}

rename($tempDir . "*", $permanentDir);

Así que cuando corrí el código de nuevo, escupió que ambas rutas eran directorios. Estaba perplejo. Hablé con un compañero de trabajo y sugirió: "¿Por qué no cambiar el nombre del directorio temporal al nuevo directorio, ya que desea mover todos los archivos de todos modos?"

Resulta que esto es lo que terminé haciendo. Dejé de intentar usar el comodín con la función rename() y en su lugar solo usé la rename() para cambiar el nombre del directorio temporal al permanente.

Así que se ve así.

$tempDir = '/home/site/images/tmp/';
$permanentDir = '/home/site/images/' . $claimid; // this was stored above
mkdir($permanentDir,0775);

rename($tempDir, $permanentDir);

Esto funcionó muy bien para mis propósitos, ya que no necesito que el antiguo directorio tmp permanezca allí después de que los archivos se hayan subido y "movido".

Espero que esto ayude. Si alguien sabe por qué el comodín no funciona en el rename() función y por qué estaba recibiendo el error que indica arriba, por favor, hágamelo saber.

 1
Author: paviktherin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-09 02:44:03

Probado este?:

     <?php

     $oldfolderpath = "old/folder";
     $newfolderpath = "new/folder";

     rename($oldfolderpath,$newfolderpath);
     ?>
 1
Author: T.Todua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-22 16:34:17

Prueba esto: cambiar el nombre('ruta/*', 'newpath/');

No veo ningún punto en tener un asterisco en el destino

 0
Author: Aadith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-17 18:50:59

Si el directorio de destino no existe, necesitará crearlo primero:

mkdir('newpath');
rename('path/*', 'newpath/');
 0
Author: Adam Hopkinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-17 18:55:39

Como nota al margen; cuando copia archivos a otra carpeta, su última hora cambiada se convierte en la marca de tiempo actual. Así que deberías tocar() los nuevos archivos.

... (some codes for directory looping) ...
if (copy($source.$file, $destination.$file)) {
   $delete[] = $source.$file;

   $filetimestamp = filemtime($source.$file); 
   touch($destination.$file,$filetimestamp);
}
... (some codes) ...
 0
Author: trante,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-07 21:04:09

No estoy seguro de si esto ayuda a alguien o no, pero pensé en publicar de todos modos. Tuve un desafío donde tengo montones de películas que había comprado y descargado a través de varias tiendas en línea, todas almacenadas en una carpeta, pero todas en sus propias subcarpetas y todas con diferentes convenciones de nomenclatura. Quería moverlos a todos en la carpeta principal y cambiarles el nombre para que se vieran bonitos. todas las subcarpetas que había logrado cambiar el nombre con una herramienta de cambio de nombre masivo y formato de nombre condicional. las subcarpetas tenían otro archivos en ellos que no quería. así que escribí el siguiente script php, 1. renombrar / mover todos los archivos con extensión mp4 a su directorio padre mientras les da el mismo nombre que su carpeta contenedora, 2. eliminar el contenido de las subcarpetas y buscar directorios dentro de ellos para vaciar y luego rmdir, 3. rmdir las subcarpetas.

$handle = opendir("D:/Movies/");
while ($file = readdir($handle)) {
if ($file != "." && $file != ".." && is_dir($file)) {
    $newhandle = opendir("D:/Movies/".$file);
    while($newfile = readdir($newhandle)) {
        if ($newfile != "." && $newfile != ".." && is_file("D:/Movies/".$file."/".$newfile)) {
            $parts = explode(".",$newfile);
            if (end($parts) == "mp4") {
                if (!file_exists("D:/Movies/".$file.".mp4")) {
                    rename("D:/Movies/".$file."/".$newfile,"D:/Movies/".$file.".mp4");
                }
                else {
                    unlink("D:/Movies/".$file."/".$newfile);
                }
            }
            else { unlink("D:/Movies/".$file."/".$newfile); }
        }
        else if ($newfile != "." && $newfile != ".." && is_dir("D:/Movies/".$file."/".$newfile)) {
            $dirhandle = opendir("D:/Movies/".$file."/".$newfile);
            while ($dirfile = readdir($dirhandle)){
                if ($dirfile != "." && $dirfile != ".."){
                    unlink("D:/Movies/".$file."/".$newfile."/".$dirfile);
                }
            }
            rmdir("D:/Movies/".$file."/".$newfile);
        }
    }
    unlink("D:/Movies/".$file);
}
}
 0
Author: senya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-14 22:01:13