Raketenwilli: Verzeichnis leeren - und noch ein ernster Fehler

Beitrag lesen

Moin Bastian,

ich möchte ein verzeichnis mittels php leeren, aber es wird nicht geleert, obwohl mir die Dateien aufgelistet werden.

Werden die Dateien auch nach dem Löschen noch aufgelistet?

Woran liegt das?

In dem Fall würde „die Dateien“ nicht gelöscht – üblicherweise gibt es dafür eine Fehlermeldung.

// Verzeichnis leeren
$dir = dirname(__FILE__) .'/ordner';
foreach(scandir($dir) as $file) {
    if($file === ".." or $file === ".") {
        continue;
    }
    echo $file."<br>";
    unlink(dirname(__FILE__) .$file);
}

Du iterierst über dirname(__FILE__) . '/ordner, löscht allerdings dann in dirname(__FILE__). Passt die Fehlermeldung/der Rückgabewert von unlink dazu?

Viele Grüße
Robert

Ok. Die Lösung demnach wohl:

// Verzeichnis leeren
$dir = dirname(__FILE__) .'/ordner/';
foreach(scandir($dir) as $file) {
     if($file === ".." or $file === ".") {
         continue;
     }
     echo $file."<br>";
     unlink( $dir . $file);
}

ABER!

Schon der Ordner 'ordner' gefällt mir nicht.

Erzeuge den für jeden Benutzer neu:

<?php
## Diese Funktion legt ein eindeutig benanntes temporäres Verzeichnis
## an und gibt im Erfolgsfall den Name zurück, sonst false
## Parameter $errorType = siehe https://www.php.net/manual/de/errorfunc.constants.php
## Parameter $baseDir: Ein Verzeichnis in dem das Verzeichnis angelegt wird. Wenn nicht übergeben, leer oder falsy wird das TMP-Verzeichnis des Systems benutzt.

function mkTempDir(
    $errorType = E_USER_ERROR,
    $baseDir   = ''
) {

    if ( ! $baseDir ) {
        $tmpdirName = sys_get_temp_dir() . '/' . uniqid( true );
    } else {
        $tmpdirName = $baseDir  . '/' . uniqid();
    }
    if ( mkdir( $tmpdirName ) ) {
        return true;
    } else {
        trigger_error (
            "Das Verzeichnis '$tmpdirName' konnte nicht angelegt werden",             
            $errorType
        );
        return $tmpdirName;
    }
}

### Usage:
# In den meisten Fällen wird derlei über
# mehrere Skripte hinweg benötigt. Deshalb:
session_start();
$_SESSION['tmpdir'] = mkTempDir();

?>

Machst Du das mit dem statischen Ordnername und zwei Benutzer agieren über Kreuz, dann löscht oder überschreibt der eine Benutzer die Dateien des anderen. Oder der andere bekommt die Rechnungen des einen...