Thema: PHP nicht leeres Verzeichnis Löschen

<?php
function readdeldirs($dir)
{
    if($dir[strlen($dir)-1]!='/')$dir.='/';
    $dirs=Array();
    $dh=opendir($dir);
    while(gettype($datei=readdir($dh))!='boolean')
    {
        if($datei!='.' && $datei!='..')
        {
            if(is_dir($dir.$datei))$dirs=array_merge($dirs,readdeldirs($dir.$datei));
            $dirs[]=$dir.$datei;
        }
    }
    
    closedir($dh);
    return $dirs;
}

function deltree($dir)
{
    $load=readdeldirs($dir);
    array_multisort($load, SORT_DESC);
    foreach($load as $del)
    {
        if(is_dir($del))
        {
            rmdir($del);
        }
        if(is_file($del))
        {
            unlink($file);
        }
    }
    rmdir($dir);
}

deltree('download');

closedir returned immer false. Ich find den Fehler einfach nicht und dann kommt für die Files und Ordner dann immer permission denied.

EDIT: glaub ich bin im falschen Bereich

2

Re: PHP nicht leeres Verzeichnis Löschen

Das liegt wohl daran, dass Dir für bestimmte Dateien die Zugriffsrechte fehlen. Probier mal das folgende Skript:

<?php

    function delDirRecursive($file = '')
     {
        clearstatcache();
        if (file_exists($file))
        {
            @chmod($file,0777);
            if (is_dir($file))
            {
                $handle = opendir($file);
                while($filename = readdir($handle))
                {
                    if ($filename != $file && $filename != "." && $filename != ".." && substr($filename,0,1)!='.' && $filename != 'CVS')
                    {
                        $this->delDirRecursive($file."/".$filename);
                    }
                }
                closedir($handle);
                @rmdir($file);
            }
            else
            {
                unlink($file);
            }
        }
    }
?> 
_______________________________________________________________

/-/annes (j|g) ... http://www.jg-webdesign.de

3

Re: PHP nicht leeres Verzeichnis Löschen

Ich meine, mit

while (false !== ($filename = readdir($handle)))

anstatt

while($filename = readdir($handle)) 

fährst du sicherer, denn eine Datei mit dem Namen 'false' würde deine Schleife, wenn ich richtig liege, abbrechen.

Basti

Re: PHP nicht leeres Verzeichnis Löschen

Die Schleife wird ja nicht abgebrochen. Das Array wird richtig mit den richtigen Content gebildet. Die Rechte stimmen auch alle. Nur kann ichs nach der Arraybildung nichtmehr löschen. Davor geht es jedoch wenn ichs einzeln mit unlink lösche.

5

Re: PHP nicht leeres Verzeichnis Löschen

...mein Posting bezog sich auf Hennes' Code. Ich hab da grad mal rumprobiert: Die Bedingung

$filename = readdir($handle)

ergibt false, wenn eine Datei den Namen '0' trägt. Daher ist

false !== ($filename = readdir($handle))

die bessere Wahl (und ja auch klarer, als gegen den Datentyp bool hin zu evaluieren, wie du es machst).

Geht es denn nun mit Hannes' Code, oder nicht?

Basti

Re: PHP nicht leeres Verzeichnis Löschen

jo der code geht *danke* big_smile

aber warum geht der alte code nich *wunder*

nur das $this-> musste weg.

7

Re: PHP nicht leeres Verzeichnis Löschen

<?php
function deltree($DIR = FALSE) 
{
    if ( ! $DIR OR ! is_dir($DIR)) return false;

    if (substr($DIR,-1) != "/") $DIR .= "/";
    if ($d = dir($DIR)) 
    {
        while ($n = $d->read()) 
        {
            if ($n == "." OR $n == "..") continue;
            if (!is_writable($DIR . $n)) return false;
            if (is_dir($DIR . $n) AND deltree($DIR . $n)) rmdir ($DIR . $n);
            if (is_file($DIR . $n)) unlink ($DIR . $n);
        }
        $d->close();
    }
    return true;
}
$path = "./dir0"; 
$flag = deltree($path);

printf ('<p>%s Verzeichnis %s wurde %s gelöscht.</p>', 
        ($flag ? '' : '<b>ERROR:</b> '),
        $path,
        ($flag ? 'rekursiv' : 'nicht'));
?>

8

Re: PHP nicht leeres Verzeichnis Löschen

...auch hier wieder anstatt:

while ($n = $d->read())

folgenden Code verwenden:

while (false !== ($n = $d->read()))

Sonst läuft das Skript bei einer Datei/einem Verzeichnis mit dem Namen '0' auf.

Basti

9

Re: PHP nicht leeres Verzeichnis Löschen

folgenden Code verwenden:

while (false !== ($n = $d->read()))

Sonst läuft das Skript bei einer Datei/einem Verzeichnis mit dem Namen '0' auf.

Stimmt. http://test.php-help.info/test_deltree/index.php