Rolf B: PHP: Verzeichnis rekursiv löschen (neue Version, Diskussion)

Beitrag lesen

Hallo Raketenwilli,

deine Lösung ist "klassisch" rekursiv ausprogrammiert und würde vermutlich auch in PHP 4 funktionieren. Es gibt aber ein paar Schätze in PHP, die nicht so bekannt sind.

Ist jetzt ungetestet zusammengehauen, ist schlechter lesbar und tut auch weniger als deins. Ich möchte nur zwei Ideen zeigen: Die Iteratorklassen und die Verwendung von anonymen Funktionen (oder Pfeilfunktionen) um Code ein- und auszuschalten.

$rd = new RecursiveIteratorIterator(
         new RecursiveDirectoryIterator("D:\phpweb")
      );

if ($logDelete)
{
  // Moderner: Pfeilfunktion
  $logSuccess = fn($what,$name) => trigger_error("$what '$name' wurde gelöscht", E_USER_NOTICE);
}
else
{
  // Etwas klassischer: Anonyme Funktion
  $logSuccess = function($what,$name) { return false; };
}

// Verzeichnisinhalt einsammeln
$fileInfos = [];
foreach ($rd as $fileInfo)
{
   $fileInfos[] = $rd;
}

// Trefferliste rückwärts abarbeiten, weil "." und ".." je Directory als
// erstes gelistet werden. Damit kann man bei Erreichen von "." einfach
// den Ordner löschen
for ($i = count($fileInfos)-1; $i >= 0; $i--) {
   if ($fileInfos[$i]->isFile() || $fileInfos[$i]->isLink())
   {
      unlink($fileInfos[$i]->getFilename());
      // Todo: Check+Log Error
      $logSuccess('Datei', $fileInfos[$i]->getFilename());
   }
   elseif ($fileInfos[$i]->getFilename() == ".")
   {
      rmdir($fileInfos[$i]->getPath());
      // Todo: Check+Log
      $logSuccess('Verzeichnis', $fileInfos[$i]->getPath());
   }
}

Rolf

--
sumpsi - posui - obstruxi