Robert B.: PHP: Verzeichnis rekursiv löschen

Beitrag lesen

Moin,

Zur Belohnung noch schnell die Funktion zum rekursiven Löschen eines ganzen Verzeichnisses:

<?php

### rmdirRecursive löscht ein Verzeichnis rekursiv.
## Parameter:
## $dirName : Verzeichnis
## $verbose : true - es wird ein Array mit allen gelöschten
##                   Dateien retourniert
## $verbose : false - es wird nur der Erfolg (true/false) geliefert.
## $errorType : siehe https://www.php.net/manual/de/errorfunc.constants.php


function rmdirRecursive(
	$dirName,
	$verbose = false,
	$errorType = E_USER_ERROR
) {
	if ( ! is_dir( $dirName ) ) {
		trigger_error ( "'$dirName' existiert nicht oder ist kein Verzeichnis.", $errorType );
		return false;
	}
	
	if ( $verbose ) {
		$return = [];
	} else {
		$return = true;
	}

	foreach( scandir( $dirName ) as $item ) {
		if( $item === ".." or $item === ".") {
			continue;

Nach dem continue brauchst du das else doch gar nicht mehr.

		} else {
			$dso = $dirName . '/' . $item;
			if ( 
				is_file( $dso ) 
				or is_link( $dso )
			) {
				if ( ! unlink( $dso ) ) {
					trigger_error ( "'$dso' konnte nicht gelöscht werden." );
					return false;
				} else {
					$return[] = $dso;
				}
			} else {
				$r = rmdirRecursive( $dso, $verbose, $errorType );

Ist !(is_file or is_link) == is_dir?

				if ( false === $r ) {
					trigger_error ( "'$dso' konnte nicht gelöscht werden." );
					return false;				   
				} else {
					if ( $verbose )  {
						if ( is_array( $r ) ) {
							foreach ( $r as $i ) {
								$return[] = $i;
							}
						}
					}
				}
			}
		}
	}
	if ( rmdir( $dirName ) ) {
		if ( $verbose ) {
			$return[] = $dirName;
		}
		return $return;
	} else {
		trigger_error ( "'$dirName' konnte nicht gelöscht werden.", $errorType );
		return false;		
	}
}

## Usage example:
# print_r( rmdirRecursive( '/tmp/a', true, E_USER_ERROR ) );

Viele Grüße
Robert