Tipo,
¡Buenas noches!

En esta ocasión vengo a comentar un problema que me molestaba un poco en PHP cada vez que necesitaba eliminar un directorio y este contenía archivos. Como saben, la función rmdir no elimina directorios si existen archivos. Bueno, trabajemos en una solución para eso:

<?php
class clsArquivo
{

    public static function pegaExtensao( $nomeArquivo )
    {
        $posicao = strrpos( $nomeArquivo, "." );
        $extensao = strtolower( substr( $nomeArquivo, $posicao + 1 ) );
        return $extensao;
    }


    public static function listarArquivos( $strDiretorio, $vetExtensoes = null, $bolRecursivo = false, $bolOrdenacaoDecrescente = false )
    {
        if ( is_dir( $strDiretorio ) )
        {
            $vetor = array();
            $strDiretorio .= ( substr( $strDiretorio, -1 ) != "/" ) ? "/" : null;
            $d = dir( $strDiretorio );
            while ( false !== ( $arquivo = $d->read() ) )
            {
                if ( is_dir( $strDiretorio . $arquivo ) )
                {
                    if ( $bolRecursivo && $arquivo != "." && $arquivo != ".." )
                    {
                        $arquivo = $strDiretorio . $arquivo . "/";
                        $vetorResultante = self::listarArquivos( $arquivo, $vetExtensoes, true );
                        if ( is_array( $vetorResultante ) && count( $vetorResultante ) > 0 )
                        {
                            $vetor = array_merge( $vetor, $vetorResultante );
                        }
                    }
                }
                else
                {
                    if ( is_array( $vetExtensoes ) )
                    {
                        $ext = self::pegaExtensao( $arquivo );
                        if ( in_array( $ext, $vetExtensoes ) )
                        {
                            $strArquivo = $strDiretorio . $arquivo;
                            if ( substr( $strArquivo, 0, 2 ) == "./" )
                            {
                                $strArquivo = substr( $strArquivo, 2 );
                            }
                            if ( is_file( $strArquivo ) )
                            {
                                $vetor[] = $strArquivo;
                            }
                        }
                    }
                    else
                    {
                        $strArquivo = $strDiretorio . $arquivo;
                        if ( substr( $strArquivo, 0, 2 ) == "./" )
                        {
                            $strArquivo = substr( $strArquivo, 2 );
                        }
                        if ( is_file( $strArquivo ) )
                        {
                            $vetor[] = $strArquivo;
                        }
                    }
                }
            }
            $d->close();
            if ( count( $vetor ) > 0 )
            {
                if ( $bolOrdenacaoDecrescente )
                {
                    rsort( $vetor );
                }
                else
                {
                    usort( $vetor, 'strnatcasecmp' );
                }
            }
            return $vetor;
        }


    }


    public static function removerArquivosDoDiretorio( $strDiretorio, $vetExtensoes = null, $bolBuscaRecursiva = true )
    {

        $intSucessos = 0;

        $vetArquivos = self::listarArquivos( $strDiretorio, $vetExtensoes, $bolBuscaRecursiva );
        $numArquivos = count( $vetArquivos );
        for ( $i = 0; $i < $numArquivos; $i++ )
        {
            $arquivo = $vetArquivos[$i];
            if ( unlink( $arquivo ) )
            {
                $intSucessos++;
            }
        }

        return ($intSucessos == $numArquivos);


    }


    public static function removerDiretorio( $strDiretorio, $bolBuscaRecursiva = true )
    {

        if ( is_dir( $strDiretorio ) )
        {

            self::removerArquivosDoDiretorio( $strDiretorio, null, $bolBuscaRecursiva );


            $objects = scandir( $strDiretorio );
            foreach ( $objects as $object )
            {

                if ( $object != "." && $object != ".." )
                {

                    if ( filetype( $strDiretorio . "/" . $object ) == "dir" )
                    {
                        rmdir( $strDiretorio . "/" . $object );
                    }
                }
            }

            reset( $objects );

            return rmdir( $strDiretorio );
        }

        return false;

    }

}
?>

Algunas funciones de esta clase ya las mencioné en el post. Listado de archivos con PHP, como listFiles y catchExtension. Por tanto, me centraré en nuevas funciones. Usar la clase es muy simple para nuestro problema:

//Carregar a nossa classe para a memória
require_once("classes/clsArquivo.php");

//Apagar todos os arquivos do diretório
clsArquivo::removerArquivosDoDiretorio("C:\Diretorio");

//Apagar todos os arquivos das extensões .txt e .log, incluindo subpastas
$extensoes = array("txt", "log");
clsArquivo::removerArquivosDoDiretorio("C:\Diretorio", $extensoes, true);

//Apagar o diretório C:\Diretorio e todos os seus arquivos e subpastas
clsArquivo::removerDiretorio("C:\Diretorio", true);

¡Eso es todo!
¡Hasta luego!