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!
Comentários (0)
Carregando comentários…