2009-03-03 22 views
29

que estoy usando este pedazo de código:scandir() para encontrar las carpetas en un directorio (PHP)

$target = 'extracted/' . $name[0]; 
$scan = scandir($target); 

para escanear el directorio de una carpeta que se utiliza para la carga de cremallera. Quiero poder encontrar todas las carpetas dentro de mi carpeta $target para poder eliminarlas y sus contenidos, dejando solo los archivos en el directorio $target.

Una vez que he devuelto el contenido de la carpeta, no sé cómo diferenciar entre las carpetas y los archivos para poder eliminar las carpetas.

Además, me han dicho que la función rmdir() no puede eliminar carpetas que tienen contenido dentro de ellas, ¿hay alguna forma de evitar esto?

Gracias, Ben.

Respuesta

3

En primer lugar, rmdir() no puede eliminar una carpeta con el contenido. Si el modo seguro está desactivado, puede usar lo siguiente.

exec("rm -rf folder/"); 

También se fijan en is_dir()/is_file() o incluso mejor la PHP SPL.

+0

su función Remove funcionaba un lujo! ¿Qué hace rm -rf en realidad? Gracias –

+0

Para cualquiera que se lo pregunte, 'rm -rf' ejecuta la función' rm' en el directorio de destino (carpeta/en este caso) con las opciones '-r' (recursivo - eliminar recursivamente archivos y carpetas dentro de la carpeta de destino) y' -f' (forzar - no solicitar errores, etc. e ignorar archivos inexistentes). Básicamente, se asegura de que todos los archivos y carpetas dentro de su carpeta de destino se solucionen al eliminar el objetivo. En general, si intenta 'rm' en una carpeta que contiene otras cosas, solo arrojará un error diciendo que no está vacía. [más detalles aquí] (http://www.tutorialspoint.com/unix_commands/rm.htm) – andyface

55

Para determinar si usted tiene o no una carpeta o archivo utilizan las funciones is_dir() y is_file()

Por ejemplo:

 
$path = 'extracted/' . $name[0]; 
$results = scandir($path); 

foreach ($results as $result) { 
    if ($result === '.' or $result === '..') continue; 

    if (is_dir($path . '/' . $result)) { 
     //code to use if directory 
    } 
} 
+2

¡Esto es brillante, funciona perfectamente! Desafortunadamente, no entiendo lo que hace esta parte 'if ($ result ==='. 'Or $ result ===' .. '' continue; ', ¿te importaría explicar por favor? Gracias de nuevo. –

+3

@Ben McRae: Esto se debe a que scandir arroja los resultados "." y ".." como parte de la matriz, y en la mayoría de los casos desea ignorar esos resultados, por lo que incluí eso como parte de foreach –

+0

Solo para agregar algo de información adicional: "." representa el directorio actual, mientras que ".." representa el directorio principal de la carpeta. –

2
$directories = scandir('images'); 
foreach($directories as $directory){ 
    if($directory=='.' or $directory=='..'){ 
     echo 'dot'; 
    }else{ 
      if(is_dir($directory)){ 
        echo $directory .'<br />'; 
      } 
    } 
} 

una versión más simple y tal vez más rápido

+0

no está filtrando si el resultado en else es un directorio o no, déjeme editarlo y actualizarlo –

36

Mejor use DirectoryIterator

$path = 'extracted'; // '.' for current 
foreach (new DirectoryIterator($path) as $file) { 
    if ($file->isDot()) continue; 

    if ($file->isDir()) { 
     print $file->getFilename() . '<br />'; 
    } 
} 
1

scandir escaneará todo el directorio, puede filtrar manualmente.

pero si usted es perezoso como yo, a continuación, utilizar pegote

$scan = glob($target."/*",GLOB_ONLYDIR); 

y dará salida a una matriz de todos los directorios de su objetivo.

+0

Realmente funcionó. Me gustó. y también lo usé. Gracias –

0

También quería eliminar elementos si estaban dentro de ese directorio. rmdir no le permite eliminar directorios que contienen archivos. Pero hay una solución simple.

array_map('unlink', glob($target.'/*/*')); 
array_map('rmdir',glob($target."/*",GLOB_ONLYDIR)); 

Primero desvinculará todos los archivos en todos los subdirectorios.
En segundo lugar, eliminará todos los directorios, ya que no contienen archivos.

Si tienes sub-sub-directorios, entonces debería añadir otros 2 líneas de la siguiente manera:

array_map('unlink', glob($target.'/*/*/*')); //remove sub-sub-files 
array_map('rmdir',glob($target."/*/*",GLOB_ONLYDIR)); //remove sub-sub-directories 

array_map('unlink', glob($target.'/*/*')); //remove sub-files 
array_map('rmdir',glob($target."/*",GLOB_ONLYDIR)); //remove sub-directories 
0

La forma más rápida y sucia:

$folders = glob("<path>/*", GLOB_ONLYDIR); 

A más versátil y orientado a objetos solución, inspirada en respuestas anteriores usando DirectoryIterator pero un poco más conciso y general:

$path = '<path>'; 
    $folders = []; 

    foreach (new \DirectoryIterator($path) as $file) 
    { 
     if (!$file->isDot() && $file->isDir()) 
     { 
      $folders[] = $file; 
     } 
    } 
0

para obtener todos los archivos en todas las sub carpetas, sub

function myfunction($dir){ 

foreach ($dir as $dirname => $file) { 

if(is_dir($file) && $file != '.' && $file != '..') { 

    // echo $file; 
     $newDir = scandir($file); 
     myfunction($newDir); 

    }elseif($file !='.' && $file != '..'){ 

     echo "<br>File name is ---"; 
     echo $file; 
    } 

} // end foreach 


} //function ends 

$dirpass = scandir($mypath3); // set directory 
echo myfunction($dirpass); //  pass directory 

Vamos a obtener el resultado como el de abajo (PLZ ignorar los nombres de archivo)

File name is ----->index.PHP 
File name is -----> 100000045 Invoices Sales Magento Admin.png 
File name is -----> 100000142 Orders Sales Magento Admin(1).png 
File name is -----> 100000142 Orders Sales Magento Admin.png 
File name is ----->hrc-siberian-tiger-2-jpg_21253111.jpg 
File name is ----->images (3rd copy).jpeg 
File name is ----->images (4th copy).jpeg 
File name is ----->images (5th copy).jpeg 
File name is ----->images (another copy).jpeg 
File name is ----->images (copy).jpeg 
File name is ----->images.jpeg 
File name is ----->JPEG_example_JPG_RIP_100.jpg 
File name is ----->preload 
File name is ----->Stonehenge (3rd copy).jpg 
File name is ----->Stonehenge (4th copy).jpg 
File name is ----->Stonehenge (5th copy).jpg 
File name is ----->Stonehenge (another copy).jpg 
File name is ----->Stonehenge (copy).jpg 
File name is ----->Stonehenge.jpg 
Cuestiones relacionadas