Ordner löschen - sicher?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Ordner löschen - sicher?

    Hallo,

    nen Freund von mir brauch nen Script, dass alle Ordner in einem Ordner löscht.

    Ordnerstrktur:

    root
    - temp
    - - Data 1
    - - Data 2
    - - Data 3
    - - temp 1
    - - - Data 1
    - - - Data 2
    - - - Data 3
    - - temp 2
    - - - Data 1
    - - - Data 2
    - - - Data 3

    Ich möchte alle Ordner in temp/ löschen, jedoch nur die Ordner ... den Ordner temp samt inhalt, geschweige denn datein aus root, möchte ich nicht löschen ..

    Mein Script dazu:
    PHP-Code:
    $dir "./temp/";
    $dh  opendir($dir);
    while (
    false !== ($filename readdir($dh))) {
      if(
    $filename != "." && $filename != ".."){
       if(
    is_dir($dir.$filename)){
          
    $tempdir opendir($dir.$filename);
          while (
    false !== ($tempfiles readdir($tempdir))) {
             if(
    $tempfiles != "." && $tempfiles != ".."){
                
    unlink($dir.$filename."/".$tempfiles);
             }
          }
          
    rmdir($dir.$filename);
       }
      }

    Funktioniert soweit auch ... laut meinen lokalen Tests...
    Allerdings hatte ich einmal das Problem:
    Er hat nicht nur die Ordner in dem temp/ gelöscht sondern auch den Inhalt von temp/ ....
    Danach hatte ich glück, dass er andere Ordner aus "root" durch permission denied nicht löschen konnte ... und durfte ein Backup meiner Datei aufspielen ...

    Deshalb nun die Frage: Kann es mir passieren, dass ich mit diesem Script nochmals eine Ebene höher trete?
    Weil ich möchte ungern schuld sein, dass sein Webspace auf einmal leer ist -g-

    Anmerkung: In den ordner temp 1 etc. sind keine unter ordner mehr sondern nur Datein ..

    mfg
    danke

  • #2
    es gibt sichere codeschnipsel zum Thema recursives löschen, aber was spricht dagegen erst mit chdir in das verzeichnis zu wechseln und dann zu löschen, somit wäre wenigstens dein root sicher

    Kommentar


    • #3
      Wäre glaube nicht sicherer als der Codeschnipsel da, weil ich wohl bei dem löschen der anderen Datein die Sicherung mit "." und ".." nicht drin hatte..

      Wenn ich mit chdir arbeite und diese "Sicherung" rausnehmen würde, wäre es das gleiche wie jetzt ...da
      chdir("..")
      auch nen verzeichnis höher geht..

      mfg
      ps: naja.. ich glaub mal, es ist sicher genug ^^

      Kommentar


      • #4
        Hallo,

        ich hab es trotzdem nochmal versucht rekursive zu lösen und auch mit chdir.

        PHP-Code:
        function deldir($handle,$bool "false"){
           global 
        $otemp;
           
        $files scandir($handle);
           
        print_r($files);  // temporär
           
        chdir($handle);
           
        $temphandle str_replace('2 Backshlash','/',getcwd());

           if(
        eregi($otemp,$temphandle)){
              foreach(
        $files as $filename){
                 if(
        $filename != "." && $filename != ".."){
                    if(
        is_dir($filename)){
                       
        deldir($filename,"true");
                    }else if(
        is_file($filename) && $bool == "true"){
                      
        # unlink($filename);
                      
        echo "Gelöscht: ".getcwd().$filename."<br>";
                    }
                 }
              }
              
        # rmdir($filename);
              
        echo "Gelöscht Ordner: ".$filename."<br>";
           }
        }

        $otemp str_replace('2 Backshlash','/',getcwd());
        $dir "temp/";
        deldir($dir,"false");
        echo 
        "ende"
        Verzeichnisbaum ist nachwievor
        temp / Ordner 1 - 5 / jeweils Datei 1-5

        D.h. 5 ordner mit je 5 Datein ...und im temp sind auch 5 Datein ..

        Problem: Er geht nicht in die Tiefe und erkennt Ordner anscheinend nicht.

        Ich hab dann mal $files ausgeben lassen:

        Code:
        Array
        (
            [0] => .
            [1] => ..
            [2] => Ordner
            [3] => Ordner - Kopie
            [4] => Ordner - Kopie (2)
            [5] => Ordner - Kopie (3)
            [6] => Ordner - Kopie (4)
            [7] => blubb - Kopie (2).txt
            [8] => blubb - Kopie (3).txt
            [9] => blubb - Kopie (4).txt
            [10] => blubb - Kopie.txt
            [11] => blubb.txt
        )
        Array
        (
            [0] => .
            [1] => ..
            [2] => blubb - Kopie (2).txt
            [3] => blubb - Kopie (3).txt
            [4] => blubb - Kopie (4).txt
            [5] => blubb - Kopie.txt
            [6] => blubb.txt
        )
        Man sieht: Er geht sogar noch in den 1. Ordner rein und da wird print_r natürlich nochmal ausgegeben.

        Frage nun: Warum geht er nicht in die anderen Ordner?

        mfg
        ps: 2 Backshlash ... weil ich das mit den zeichen nicht ganz hinbekommen hab O.o
        Zuletzt geändert von Blackgreetz; 03.02.2008, 21:58.

        Kommentar


        • #5
          Ohne den Rest auf Sinn zu prüfen und ein bischen den rmdir verschoben funktioniert es so bei mir.

          Ich denke der Sinn war, das der Temp Ordner am Ende leer sein sollte ?

          EDIT: Sorry, die Files im temp selber sollte er ja nicht löschen, nun bin ich aber zu müde das noch zu ändern
          solltest dir halt den basedir/temp ordner merken und dort das unlink aussetzen.
          EDIT2: nuja, so gehts nun doch
          PHP-Code:
          error_reporting(E_ALL);
          function 
          deldir($handle,$bool "false"){
             global 
          $otemp;
             
          $files scandir($handle);
             
          print_r($files);  // temporär
             
          chdir($handle);
             
          $temphandle str_replace('2 Backshlash','/',getcwd());

             if(
          eregi($otemp,$temphandle)){
                foreach(
          $files as $filename){
                   if(
          $filename != "." && $filename != ".."){
                      if(
          is_dir($filename)){
                         
          deldir($filename,"true");
                         
          chdir("../");  // nu aber wieder raus aus dem ordner
                         
          rmdir($filename); // 
                      
          }else if(is_file($filename) && $bool == "true"){
                      
          unlink($filename);
                        echo 
          "Gelöscht: ".getcwd().$filename."\n<br>";
                      }
                   }
                }
                
                echo 
          "Gelöscht Ordner: ".$filename."\n<br>";
             }
          }

          $otemp str_replace('2 Backshlash','/',getcwd());
          $dir "temp/";
          deldir($dir,"false");
          echo 
          "ende"
          Zuletzt geändert von ; 04.02.2008, 04:04.

          Kommentar


          • #6
            Das er die Files im temp/ nicht löscht, merkt er sich bereits durch $bool

            ..aber das ich in ein Verzeichnis reingehe, es vor dem Löschen lieber wieder verlassen sollte, ist recht logisch

            Danke auf jeden Fall, funktioniert perfekt und sieht auch irgendwie besser aus, obwohl das Obere natürlich bedeutend kürzer ist.

            mfg

            Kommentar


            • #7
              gerne
              Original geschrieben von Blackgreetz
              [B]Das er die Files im temp/ nicht löscht, merkt er sich bereits durch $bool
              ich hatte zeitweilig zum testen $bool uvernünftigerweise entfernt :P

              Kommentar

              Lädt...
              X