php - txt - eliminar todo el contenido de una carpeta c#
PHP: Desvincular todos los archivos dentro de un directorio y luego eliminar ese directorio (8)
¿De alguna manera puedo usar RegExp o búsquedas con comodines para eliminar rápidamente todos los archivos dentro de una carpeta y luego eliminar esa carpeta en PHP, SIN usar el comando "exec"? Mi servidor no me da autorización para usar ese comando. Un simple bucle de algún tipo sería suficiente.
Necesito algo que logre la lógica detrás de la siguiente declaración, pero obviamente, sería válido:
$dir = "/home/dir"
unlink($dir . "/*"); # "*" being a match for all strings
rmdir($dir);
La función glob hace lo que estás buscando. Si estás en PHP 5.3+, podrías hacer algo como esto:
$dir = ...
array_walk(glob($dir . ''/*''), function ($fn) {
if (is_file($fn))
unlink($fn);
});
unlink($dir);
Puedes usar el componente del sistema de archivos de Symfony , para evitar reinventar la rueda, así puedes hacer
foreach( new RecursiveIteratorIterator(
new RecursiveDirectoryIterator( ''folder'', FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS ),
RecursiveIteratorIterator::CHILD_FIRST ) as $value ) {
$value->isFile() ? unlink( $value ) : rmdir( $value );
}
rmdir( ''folder'' );
Si prefieres administrar el código por ti mismo, aquí está el código base de Symfony para los métodos relevantes.
use Symfony/Component/Filesystem/Filesystem;
$filesystem = new Filesystem();
if ($filesystem->exists(''/home/dir'')) {
$filesystem->remove(''/home/dir'');
}
Una forma de hacerlo sería:
function unlinker($file)
{
unlink($file);
}
$files = glob(''*.*'');
array_walk($files,''unlinker'');
rmdir($dir);
Una forma simple y efectiva de eliminar todos los archivos y carpetas de forma recursiva con la biblioteca estándar de PHP , para ser específico, RecursiveIteratorIterator y RecursiveDirectoryIterator . El punto está en el indicador RecursiveIteratorIterator::CHILD_FIRST
, el iterador recorrerá primero los archivos y el directorio al final, por lo que una vez que el directorio esté vacío, es seguro usar rmdir()
.
class MyFilesystem
{
private function toIterator($files)
{
if (!$files instanceof /Traversable) {
$files = new /ArrayObject(is_array($files) ? $files : array($files));
}
return $files;
}
public function remove($files)
{
$files = iterator_to_array($this->toIterator($files));
$files = array_reverse($files);
foreach ($files as $file) {
if (!file_exists($file) && !is_link($file)) {
continue;
}
if (is_dir($file) && !is_link($file)) {
$this->remove(new /FilesystemIterator($file));
if (true !== @rmdir($file)) {
throw new /Exception(sprintf(''Failed to remove directory "%s".'', $file), 0, null, $file);
}
} else {
// https://bugs.php.net/bug.php?id=52176
if (''//' === DIRECTORY_SEPARATOR && is_dir($file)) {
if (true !== @rmdir($file)) {
throw new /Exception(sprintf(''Failed to remove file "%s".'', $file), 0, null, $file);
}
} else {
if (true !== @unlink($file)) {
throw new /Exception(sprintf(''Failed to remove file "%s".'', $file), 0, null, $file);
}
}
}
}
}
public function exists($files)
{
foreach ($this->toIterator($files) as $file) {
if (!file_exists($file)) {
return false;
}
}
return true;
}
}
Usa glob
para encontrar todos los archivos que coincidan con un patrón.
function recursiveRemoveDirectory($directory)
{
foreach(glob("{$directory}/*") as $file)
{
if(is_dir($file)) {
recursiveRemoveDirectory($file);
} else {
unlink($file);
}
}
rmdir($directory);
}
Use glob()
para recorrer fácilmente el directorio y eliminar archivos, luego puede eliminar el directorio.
foreach (glob($dir."/*.*") as $filename) {
if (is_file($filename)) {
unlink($filename);
}
}
rmdir($dir);
para eliminar todos los archivos, puede eliminar el directorio y crear nuevamente ... con una simple línea de código
<?php
$dir = ''/home/files/'';
rmdir($dir);
mkdir($dir);
?>
Prueba de manera fácil:
$dir = "/home/dir";
array_map(''unlink'', glob($dir."/*"));
rmdir($dir);
En Función para eliminar dir:
function unlinkr($dir, $pattern = "*") {
// find all files and folders matching pattern
$files = glob($dir . "/$pattern");
//interate thorugh the files and folders
foreach($files as $file){
//if it is a directory then re-call unlinkr function to delete files inside this directory
if (is_dir($file) and !in_array($file, array(''..'', ''.''))) {
unlinkr($file, $pattern);
//remove the directory itself
rmdir($file);
} else if(is_file($file) and ($file != __FILE__)) {
// make sure you don''t delete the current script
unlink($file);
}
}
rmdir($dir);
}
//call following way:
unlinkr("/home/dir");