2010-01-17 49 views
25

al mover un archivo de una ubicación a otra yo usomover todos los archivos en una carpeta a otra?

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

¿Cómo se mueve todos los archivos de una carpeta a otra carpeta? intentado éste sin resultado:

rename('path/*', 'newpath/*'); 
+0

¿Es necesario para mantener el directorio original? – Sampson

+0

que sería bueno para mantener la carpeta original ... no esta vez, pero tal vez otra vez que tendrá que seguir it..i puede sospechar lo que su enfoque es =) – ajsie

+0

pero me di cuenta de que el ive consiguió archivos en la carpeta de destino que i querer guardar. y entonces su enfoque no funciona causa No permite mover la carpeta a una carpeta de destino que ya contiene archivos – ajsie

Respuesta

52

una solución ligeramente detallado:

// 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); 
} 
+0

Tengo archivos en la carpeta de destino y quiero mantenerlos. solo mueve los archivos de una carpeta temporal a esa carpeta para que añadas archivos todo el tiempo. – ajsie

+0

no obtengo la línea: if (in_array ($ file, array (".", ".."))) continue; ¿qué está haciendo? – ajsie

+0

Noname, dos de los elementos de este conjunto serán "." representando el directorio "actual" y ".." representando el directorio "anterior". Cuando nos encontramos con esto, simplemente "continuamos", lo que significa que omitimos la iteración actual. – Sampson

0

intentar esto: de cambio de nombre ('ruta/*', 'newpath /');

no veo una razón para tener un asterisco en el destino

+0

no funcionó .. "No existe el fichero o directorio" – ajsie

0

Si no existe el directorio de destino, tendrá que crearla primero:

mkdir('newpath'); 
rename('path/*', 'newpath/'); 
+0

"No existe el fichero o directorio" – Alvin

+1

Si usted tiene un problema, enviar un código (o una nueva pregunta). –

+0

Esta respuesta no funcionó para mí. Sería genial si la función de cambio de nombre admitiera globs, pero a partir de PHP7, ese no parece ser el caso. Ejemplo: 'renombrar (/home/eric/wordpress/files/.tmp-checksum/*,/home/Eric/wordpress/archivos/núcleo): No existe el fichero o directory' Sin embargo,' ejecutan ls/home/Eric/wordpress/files/.tmp-checksum/* 'en un shell bash muestra muchos archivos. – Eric

15

Una alternativa con el uso renombrar() y con un poco de 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"; 
} 
1

así que traté de usar la función rename() como se describe y seguí recibiendo el error de espalda que había no such file or directory. Coloqué el código dentro de una declaración 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 ejecuté el código de nuevo, escupió que ambas rutas eran directorios. Estaba perplejo. Hablé con un compañero de trabajo y me sugirió: "¿Por qué no cambiar el nombre del directorio temporal al nuevo directorio, ya que quiere 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 uso el rename() para cambiar el nombre del directorio temporal al permanente.

por lo 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 no necesito el directorio tmp de edad a permanecer allí después de que los archivos se han subido y "movido".

Espero que esto ayude. Si alguien sabe por qué el comodín no funciona en la función rename() y por qué recibí el error antes mencionado, por favor, hágamelo saber.

0

Como nota al margen; cuando copia archivos a otra carpeta, su última hora cambiada se convierte en la marca de tiempo actual. Entonces debería touch() 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) ... 
1

trató éste ?:

 <?php 

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

    rename($oldfolderpath,$newfolderpath); 
    ?> 
0

No estoy seguro si esto ayuda a alguien o no, pero pensé que había puesto todos modos. Tuve un desafío en el que tenía 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 nombres. Quería moverlos a todos a la carpeta principal y cambiarles el nombre para que se vean bonitos. todas las subcarpetas que había logrado cambiar el nombre con una herramienta de cambio de nombre y formato de nombre condicional.las subcarpetas tenían otros archivos que yo no quería. Así que escribí el siguiente script php para, 1. renombrar/mover todos los archivos con la extensión mp4 a su directorio padre mientras que les da el mismo nombre que su carpeta que contiene, 2. eliminar el contenido de las subcarpetas y buscar directorios dentro de ellos a vacío 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); 
} 
} 
11

Por favor, intente esta solución, se probó con éxito ::

<?php 
    $files = scandir("f1"); 
    $oldfolder = "f1/"; 
    $newfolder = "f2/"; 
    foreach($files as $fname) { 
     if($fname != '.' && $fname != '..') { 
      rename($oldfolder.$fname, $newfolder.$fname); 
     } 
    } 
?> 
Cuestiones relacionadas