phase: rekursives löschen in verzeichnis

hallo, ich möchte bestimmte dateien in einem verzeichnis rekursiv löschen.

dazu benutze ich dieses script:
http://aktuell.de.selfhtml.org/tippstricks/php/verzeichnisse/

das funktioniert soweit nur möchte ich jetzt nciht alle dateien löschen sondern nur solche .* alle anderen sehen so aus *.htm

ich habe es so versucht:
} else if (is_file ($path.'/'.$entry) || is_link ($path.'/'.$entry) && strstr($path.'/'.$entry,".htm") == false) {

und wollte damit alle *.htm files ausschliessen. klappt aber nicht, er löscht trotzdem alles!

was mache ich falsch bzw. wie kann ich das problem lösen?

vielen dank
phase

  1. Hallo phase,

    ich habe es so versucht:
    } else if (is_file ($path.'/'.$entry) || is_link ($path.'/'.$entry) && strstr($path.'/'.$entry,".htm") == false) {

    und wollte damit alle *.htm files ausschliessen. klappt aber nicht, er löscht trotzdem alles!

    was mache ich falsch bzw. wie kann ich das problem lösen?

    Du musst Klammern korrekt setzen:

    } else if ((is_file ($path.'/'.$entry) || is_link ($path.'/'.$entry)) && strstr($path.'/'.$entry,".htm") == false) {

    Siehe: < http://de3.php.net/de/operators> Dort steht, dass der &&-Operator mehr "bindet" als der ||-Operator. Denk an die Mathematik: dort gilt ja "Punkt vor Strict", d.h. 4 + 5 * 2 ist 14 und nicht 18. Genauso ist A || B && C in PHP das gleiche wie A || (B && C) und eben nicht (A || B) && C. Nachdem sich kein normaler Mensch die Reihenfolge der Operatoren wird merken können (mich eingeschlossen), empfielt es sich, bei solchen Konstruktionen *immer* Klammern zu setzen.

    Achja, wenn Du nicht alle Dateien aus einem Verzeichnis löscht, dann kann das Verzeichnis selbst natürlich auch nicht gelöscht werden und die Funktion wird einen Fehler zurückgeben - was dann aber normal ist. Oder Du entfernst einfach den rmdir()-Aufruf und gibst an der Stelle true zurück.

    Viele Grüße,
    Christian

    1. Hallo Christian,

      Du musst Klammern korrekt setzen:

      } else if ((is_file ($path.'/'.$entry) || is_link ($path.'/'.$entry)) && strstr($path.'/'.$entry,".htm") == false) {

      Denk an die Mathematik: dort gilt ja "Punkt vor Strict"

      klinkt logisch wäre ich aber so nie drauf gekommen.

      aber mit deinem beisp. werden jetzt zwar die die files ohn .htm gelöscht aber nicht mehr in jedem unterverzeichnis sondern nur noch im ersten.

      ich rufe die function so auf:
      rec_rmdir("./tmp");

      damit sollen alle dateien im verzeichnis tmp und dessen unterverzeichnisse mit eingeschlossen werden, das werden sie aber nicht ;-(

      wenn ich die abfrag so setze
      } else if (is_file ($path.'/'.$entry) || is_link ($path.'/'.$entry)) {
      werden alle dateien gelöscht, auch die in den unterverzeichnissen.

      ich finde den fehler leider nicht.

      danke

      phase

      1. Hallo phase,

        ich rufe die function so auf:
        rec_rmdir("./tmp");

        damit sollen alle dateien im verzeichnis tmp und dessen unterverzeichnisse mit eingeschlossen werden, das werden sie aber nicht ;-(

        Wie gesagt, die Funktion bricht ab, wenn sie versucht, ein Verzeichnis komplett zu löschen, das noch einen Inhalt besitzt.

        Entferne doch einfach mal folgenden Code aus der Funktion:

        ----------------------
            // versuche nun, das Verzeichnis zu loeschen
            $res = @rmdir ($path);

        // gab's einen Fehler?
            if (!$res) {
                return -2; // melde ihn
            }
        ----------------------

        Dann sollte es klappen.

        Viele Grüße,
        Christian

        1. Entferne doch einfach mal folgenden Code aus der Funktion:


          // versuche nun, das Verzeichnis zu loeschen
              $res = @rmdir ($path);

          // gab's einen Fehler?
              if (!$res) {
                  return -2; // melde ihn
              }

          Dann sollte es klappen.

          leider nicht, ich hatte diesen teil zuvor shcon auskommentiert!

          hast du noch eine idee?

          1. Hallo phase,

            leider nicht, ich hatte diesen teil zuvor shcon auskommentiert!

            hast du noch eine idee?

            Poste mal den Inhalt der gesamten Funktion so, wie Du sie jetzt hast.

            Viele Grüße,
            Christian

            1. function rec_rmdir ($path) {
                  // schau' nach, ob das ueberhaupt ein Verzeichnis ist
                  if (!is_dir ($path)) {
                      return -1;
                  }
                  // oeffne das Verzeichnis
                  $dir = @opendir ($path);

              // Fehler?
                  if (!$dir) {
                      return -2;
                  }

              // gehe durch das Verzeichnis
                  while ($entry = @readdir($dir)) {
                      // wenn der Eintrag das aktuelle Verzeichnis oder das Elternverzeichnis
                      // ist, ignoriere es
                      if ($entry == '.' || $entry == '..') continue;
                      // wenn der Eintrag ein Verzeichnis ist, dann
                      if (is_dir ($path.'/'.$entry)) {
                          // rufe mich selbst auf
                          $res = rec_rmdir ($path.'/'.$entry);
                          // wenn ein Fehler aufgetreten ist
                          if ($res == -1) { // dies duerfte gar nicht passieren
                              @closedir ($dir); // Verzeichnis schliessen
                              return -2; // normalen Fehler melden
                          } else if ($res == -2) { // Fehler?
                              @closedir ($dir); // Verzeichnis schliessen
                              return -2; // Fehler weitergeben
                          } else if ($res == -3) { // nicht unterstuetzer Dateityp?
                              @closedir ($dir); // Verzeichnis schliessen
                              return -3; // Fehler weitergeben
                          } else if ($res != 0) { // das duerfe auch nicht passieren...
                              @closedir ($dir); // Verzeichnis schliessen
                              return -2; // Fehler zurueck
                          }
                    //} else if (is_file ($path.'/'.$entry) || is_link ($path.'/'.$entry)) {
                      } else if ((is_file ($path.'/'.$entry) || is_link ($path.'/'.$entry)) && strstr($path.'/'.$entry,".htm") == false) {
                          // ansonsten loesche diese Datei / diesen Link
                          echo "<code><b>".$path."/".$entry." wird gelöscht:</b><br />size: ".filesize($path.'/'.$entry)." <span style="color:#FF0000">DELETED</span></code><br />";
                          $res = @unlink ($path.'/'.$entry);
                          // Fehler?
                          if (!$res) {
                              @closedir ($dir); // Verzeichnis schliessen
                              return -2; // melde ihn
                          }
                      } else {
                          // ein nicht unterstuetzer Dateityp
                          @closedir ($dir); // Verzeichnis schliessen
                          return -3; // tut mir schrecklich leid...
                      }
                  }

              // schliesse nun das Verzeichnis
                  @closedir ($dir);

              // versuche nun, das Verzeichnis zu loeschen
                  //$res = @rmdir ($path);

              /* gab's einen Fehler?
                  if (!$res) {
                      return -2; // melde ihn
                  }
                  */
                  // alles ok
                  return 0;
              }

              rec_rmdir("./tmp");

              1. Hallo,

                Da liegt der Fehler:

                -----------------------------------------
                        } else if ((is_file ($path.'/'.$entry) || is_link ($path.'/'.$entry)) && strstr($path.'/'.$entry,".htm") == false) {
                            // ansonsten loesche diese Datei / diesen Link
                            echo "<code><b>".$path."/".$entry." wird gelöscht:</b><br />size: ".filesize($path.'/'.$entry)." <span style="color:#FF0000">DELETED</span></code><br />";
                            $res = @unlink ($path.'/'.$entry);
                            // Fehler?
                            if (!$res) {
                                @closedir ($dir); // Verzeichnis schliessen
                                return -2; // melde ihn
                            }
                        } else {
                            // ein nicht unterstuetzer Dateityp
                            @closedir ($dir); // Verzeichnis schliessen
                            return -3; // tut mir schrecklich leid...
                        }
                -----------------------------------------

                Sobald eine nicht-.htm-Datei gefunden wird, bricht er komplett ab. Daher:

                -----------------------------------------
                        } else if (is_file ($path.'/'.$entry) || is_link ($path.'/'.$entry)) {
                            // ansonsten loesche diese Datei / diesen Link
                            echo "<code><b>".$path."/".$entry." wird gelöscht:</b><br />size: ".filesize($path.'/'.$entry)." <span style="color:#FF0000">DELETED</span></code><br />";
                            if (strstr($path.'/'.$entry,".htm") == false) {
                              $res = @unlink ($path.'/'.$entry);
                            } else {
                              $res = true;
                            }
                            // Fehler?
                            if (!$res) {
                                @closedir ($dir); // Verzeichnis schliessen
                                return -2; // melde ihn
                            }
                        } else {
                            // ein nicht unterstuetzer Dateityp
                            @closedir ($dir); // Verzeichnis schliessen
                            return -3; // tut mir schrecklich leid...
                        }
                -----------------------------------------

                Viele Grüße,
                Christian

                1. Super, das war's!

                  vielen dank, jetzt klappt es.

                  gruß aus Hamburg
                  phase