Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Matias Rezende

Script para ler e excluir diretório e arquivos recursivamente

Recommended Posts

Pessoal

 

Hoje precisava apagar arquivos dentro de uma pasta e a pasta, só que a pasta estava cheia de arquivos. Então, por necessidade, escrevi esta função.

 

<?php
function limparDiretorios($caminhoParaDiretorio) {
	// definindo um array para exibir os erros
	$erros = array ();
	// definindo o objeto que faz a iteração do diretório
	$diretorio = new RecursiveDirectoryIterator ( $caminhoParaDiretorio );
	// definindo o objeto que fará a iteração recursiva
	$arquivos = new RecursiveIteratorIterator ( $diretorio, RecursiveIteratorIterator::CHILD_FIRST );
	// iterando o objeto
	foreach ( $arquivos as $arquivo ) {
		// verificando permissão, ou seja, se o arquivo pode ser modificado
		if ($arquivo->isWritable ()) {
			// verificamos se a iteração atual é de um diretório
			if ($arquivo->isDir ()) {
				// se for, utilizamos rmdir para excluir
				rmdir ( $arquivo->getPathname );
				// senão, testamos se é um arquivo
			} elseif ($arquivo->isFile ()) {
				// para arquivos, utilizamos o unlink
				unlink ( $arquivo->getPathname );
			}
			// caso o arquivo não possa ser modificado, gravamos na variável o nome do arquivo e a permissão do arquivo
		} else {
			$erros [] = 'O arquivo ' . $arquivo->getPathname . ' tem permissões ' . $arquivo->getPerms () . ' e não pode ser excluído.';
		}
	}
	// caso existam erros, mostramos, ou exibimos mensagem de sucesso.
	if (count ( $erros )) {
		return implode ( '<br />', $erros );
	} else {
		return 'Arquivos excluídos com sucesso.';
	}
}
echo limparDiretorios( 'caminho/para/o/diretorio' );
O grande detalhe, que me fez perder um tempão, foi aqui:

$arquivos = new RecursiveIteratorIterator ( $diretorio, RecursiveIteratorIterator::CHILD_FIRST );
Ao utilizar o segundo parâmetro com o CHILD_FIRST, o diretório só será iterado após todos os seus arquivos serem iterados e apagados.

 

Espero que ajude.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz uns testes hoje e vi que tinha alguns erros no código. Código atualizado:

<?php
function limparDiretorios($caminhoParaDiretorio) {
// definindo um array para exibir os erros
$erros = array ();
// definindo o objeto que faz a iteração do diretório
$diretorio = new RecursiveDirectoryIterator ( $caminhoParaDiretorio );
// definindo o objeto que fará a iteração recursiva
$arquivos = new RecursiveIteratorIterator ( $diretorio, RecursiveIteratorIterator::CHILD_FIRST );
// iterando o objeto
foreach ( $arquivos as $arquivo ) {
	// verificando permissão, ou seja, se o arquivo pode ser modificado
	if ($arquivo->isWritable ()) {
		// verificamos se a iteração atual é de um diretório
		if ($arquivo->isDir ()) {
			// se for, utilizamos rmdir para excluir
			rmdir ( $arquivo->getPathname() );
			// senão, testamos se é um arquivo
		} elseif ($arquivo->isFile ()) {
			// para arquivos, utilizamos o unlink
			unlink ( $arquivo->getPathname() );
		}
		// caso o arquivo não possa ser modificado, gravamos na variável o nome do arquivo e a permissão do arquivo
	} else {
		$erros [] = 'O arquivo ' . $arquivo->getPathname() . ' tem permissões ' . $arquivo->getPerms () . ' e não pode ser excluído.';
	}
}
// caso existam erros, mostramos, ou exibimos mensagem de sucesso.
if (count ( $erros )) {
	return implode ( '<br />', $erros );
} else {
	return 'Arquivos excluídos com sucesso.';
}
}
echo limparDiretorios( 'caminho/para/o/diretorio' );

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.