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

Beitrag lesen

Nach einigem Wühlen im Handbuch und kleineren Korrekturen hatte ich das Skript so weit, dass es hätte laufen müssen ... tat es aber nicht.

Warning: rmdir(/tmp/a): Directory not empty 
…
Warning:  rmdir(/tmp/a/b): Directory not empty

Ursache:

<?php
#/* 
exec("
mkdir /tmp/a;
mkdir /tmp/a/a;
touch /tmp/a/a/a;
touch '/tmp/a/a/a a';
touch /tmp/a/a/.a;
mkdir /tmp/a/b;
touch /tmp/a/b/a;
touch /tmp/a/b/b;
touch /tmp/a/b/c;
mkdir /tmp/a/c;
");
# */

	// Verzeichnisinhalt einsammeln
	$fileInfos = [];
	$rd = new RecursiveIteratorIterator(
			 new RecursiveDirectoryIterator( '/tmp/a' )
		  );
    $i=0;
	foreach ( $rd as $fileInfo ) {
		$fileInfos[] = $fileInfo;
		echo $i++ . ": " .  $fileInfo ->getPathname() . PHP_EOL;
	}

Ausgabe:

0: /tmp/a/c/.
1: /tmp/a/c/..
2: /tmp/a/b/c
3: /tmp/a/b/b
4: /tmp/a/b/.
5: /tmp/a/b/a
6: /tmp/a/b/..
7: /tmp/a/.
8: /tmp/a/a/.
9: /tmp/a/a/a a
10: /tmp/a/a/.a
11: /tmp/a/a/a
12: /tmp/a/a/..
13: /tmp/a/..

Deine Annahmen (Das Handbuch sagt nichts dazu) über die Sortierung des RecursiveDirectoryIterator sind also unzutreffend. Tatsächlich ist diese „zufällig“. Einen Parameter oder eine Methode zum Sortieren hab ich nicht gefunden, die müsste geschrieben werden.

Ich vermute, wenn ich das umbaue, geht jeder Vorteil der Nutzung der Objekte verloren.

Getestet mit PHP 8.1.2 (cli) (built: Apr 7 2022 17:46:26) (NTS) (Armbian/Ubuntu 22.04 LTS auf dem Raspi400, also aarch64)