2011-10-07 11 views
5

Escribí la función recursiva de PHP para borrar la carpeta. Me pregunto, ¿cómo modifico esta función para eliminar todos los archivos y carpetas en el alojamiento web, excluyendo la matriz de archivos y nombres de carpetas (por ejemplo, cgi-bin, .htaccess)?Función de eliminación recursiva de PHP

Por cierto

Para utilizar esta función para eliminar totalmente un directorio de llamadas como esta

recursive_remove_directory('path/to/directory/to/delete'); 

utilizar esta función para vaciar un directorio de llamadas como esta:

recursive_remove_directory('path/to/full_directory',TRUE); 

Ahora la función es

function recursive_remove_directory($directory, $empty=FALSE) 
{ 
    // if the path has a slash at the end we remove it here 
    if(substr($directory,-1) == '/') 
    { 
     $directory = substr($directory,0,-1); 
    } 

    // if the path is not valid or is not a directory ... 
    if(!file_exists($directory) || !is_dir($directory)) 
    { 
     // ... we return false and exit the function 
     return FALSE; 

    // ... if the path is not readable 
    }elseif(!is_readable($directory)) 
    { 
     // ... we return false and exit the function 
     return FALSE; 

    // ... else if the path is readable 
    }else{ 

     // we open the directory 
     $handle = opendir($directory); 

     // and scan through the items inside 
     while (FALSE !== ($item = readdir($handle))) 
     { 
      // if the filepointer is not the current directory 
      // or the parent directory 
      if($item != '.' && $item != '..') 
      { 
       // we build the new path to delete 
       $path = $directory.'/'.$item; 

       // if the new path is a directory 
       if(is_dir($path)) 
       { 
        // we call this function with the new path 
        recursive_remove_directory($path); 

       // if the new path is a file 
       }else{ 
        // we remove the file 
        unlink($path); 
       } 
      } 
     } 
     // close the directory 
     closedir($handle); 

     // if the option to empty is not set to true 
     if($empty == FALSE) 
     { 
      // try to delete the now empty directory 
      if(!rmdir($directory)) 
      { 
       // return false if not possible 
       return FALSE; 
      } 
     } 
     // return success 
     return TRUE; 
    } 
} 
+0

Consulte http://trac.symfony-project.org/browser/branches/1.4/lib/util/sfToolkit.class.php#L54 para ver una implementación existente. –

Respuesta

4

intentar algo como esto:

$it = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator('%yourBaseDir%'), 
    RecursiveIteratorIterator::CHILD_FIRST 
); 

$excludeDirsNames = array(); 
$excludeFileNames = array('.htaccess'); 

foreach($it as $entry) { 
    if ($entry->isDir()) { 
    if (!in_array($entry->getBasename(), $excludeDirsNames)) { 
     try { 
     rmdir($entry->getPathname()); 
     } 
     catch (Exception $ex) { 
     // dir not empty 
     } 
    } 
    } 
    elseif (!in_array($entry->getFileName(), $excludeFileNames)) { 
    unlink($entry->getPathname()); 
    } 
} 
+0

Mi directorio base es la carpeta www y el archivo con esta función estará dentro de la carpeta www. ¿Cuál será '% yourBaseDir%'? ¿También eliminará toda la carpeta recursiva? y cómo lidiar con .htaccess? – heron

+0

Mi directorio base es la carpeta www y el archivo con esta función estará dentro de la carpeta www. ¿Cuál será% yourBaseDir%? Me refiero a que la función debe eliminar todos los archivos y carpetas en la carpeta actual y excluir las matrices, y en sí mismo – heron

+0

Obtención de errores: 'Directorio no vacío en la línea rmdir ($ entry-> getPathname()); ' – heron

0
  1. Usted puede proporcionar un parámetro de matriz adicional $exclusions a recursive_remove_directory(), pero usted tendrá que pasar este parámetro cada vez de forma recursiva.

  2. Marca $exclusions global. De esta manera se puede acceder en cada nivel de recursión.

+0

por favor aplique su idea al código dado – heron

0

estoy usando esta función para borrar la carpeta con todos los archivos y subcarpetas:

function removedir($dir) { 
    if (substr($dir, strlen($dir) - 1, 1) != '/') 
     $dir .= '/'; 
    if ($handle = opendir($dir)) { 
     while ($obj = readdir($handle)) { 
      if ($obj != '.' && $obj != '..') { 
       if (is_dir($dir . $obj)) { 
        if (!removedir($dir . $obj)) 
         return false; 
       } 
       else if (is_file($dir . $obj)) { 
        if (!unlink($dir . $obj)) 
         return false; 
       } 
      } 
     } 
     closedir($handle); 
     if ([email protected]($dir)) 
      return false; 
     return true; 
    } 
    return false; 
} 

$folder_to_delete = "folder"; // folder to be deleted 

echo removedir($folder_to_delete) ? 'done' : 'not done'; 

IIRC que obtuve esto desde php.net

Cuestiones relacionadas