mkdir geht nur bei 1 vezeichnis, warum?

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

  • mkdir geht nur bei 1 vezeichnis, warum?

    ich habe 2 ordner:

    Code:
    $VZ = '.../fotos/klein/';
    $VZ2 = '.../fotos/';
    jetzt prüfe ich bei jedem ordner, ob dieser leer ist.

    Code:
    $Z = count(scandir($VZ))-2;  // minus 2, um den punkt und den doppelpunkt abzuziehen
    $Z2 = count(scandir($VZ2))-3;// minus 3, um den punkt und den doppelpunkt abzuziehen und den unterordner
    jetzt prüfe ich ob die werte 0 ergeben

    Code:
    if($Z==0)	{rmdir($VZ);}
    if($Z2==0)	{rmdir($VZ2);}
    bis zur vorletzten zeile klappt alles, aber dann bei if($z2.... meckert php das das verzeichnis nicht leer ist.

    ABER ich lösche zuerst das unterverzeichnis (das funktioniert ja) und dann ist das große verzeichnis doch leer (von meiner logik her) und dann müßte das große verz. gelöscht werden.

    darum zuerst $VZ (kleines Verz.) und dann erst $VZ2 (das große verzeichnis)!

    wo ist da der fehler?

  • #2
    Wenn es nicht leer ist, kann es nicht gelöscht werden.
    Da hilft dann auch kein PHP: clearstatcache - Manual
    Wir werden alle sterben

    Kommentar


    • #3
      Willst du ein Verzeichnis löschen, welches andere Verzeichisse oder Dateien enthält, musst du erst diese löschen. Das macht man am besten per Rekursion, beispielsweise so:

      PHP-Code:
      class dos_dir {

          
      /// recursive rmdir()
          /// return BOOL success
          
      static function rm(
              
      $path NULL /// STR(path) path to directory
          
      ) {
              
      // @ is needed because rmdir() emits a warning if dir is not empty
              
      if (@rmdir($path_abs realpath($path))) {
                  return 
      TRUE// empty dir successfully deleted
              
      }
              if (
      FALSE === $dh opendir($path_abs)) {
                  return 
      FALSE;
              }
              while (
      FALSE !== $entry readdir($dh)) {
                  if (
      '.' === $entry '..' === $entry) {
                      continue;
                  }
                  
      $path_sub $path_abs DIR_SEP $entry;
                  if (
      is_dir($path_sub)) {
                      if (!
      self::rm($path_sub)) {
                          
      closedir($dh);
                          return 
      FALSE;
                      }
                  }
                  else {
                      if (!
      unlink($path_sub)) {
                          
      closedir($dh);
                          return 
      FALSE;
                      }
                      continue;
                  }
              } 
      /// endwhile readdir()
              
      closedir($dh);
              
      // dir should be empty now
              
      return rmdir($path_abs);
          }
      }

      // usage:
      dos_dir::rm($directory_to_delete_recursively); 
      Zuletzt geändert von fireweasel; 14.11.2009, 19:59.
      Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

      Kommentar


      • #4
        Zitat von Gamer20 Beitrag anzeigen
        wo ist da der fehler?
        Der Fehler beginnt hier:
        Code:
        $VZ = '.../fotos/klein/';
        $VZ2 = '.../fotos/';
        Du hast vermutlich kein Verzeichnis namens "..." sondern meinst "..", also eine Ebene höher.

        Hättest du dein error_reporting aufgedreht wie es in unseren Forumsregeln erklärt wird, hätte dich scandir() informiert, dass es die Verzeichnisse allesamt nicht findet.

        Kommentar


        • #5
          nein die punkte habe ich jetzt nur für euch so gemacht, normal gebe ich den direkten pfad an (mit Rootverzeichnis). die pfade stimmen auch.

          also ich habe das jetzt paar mal getestet und zu 50% wirds gelöscht und dann passierts auch mal, das NUR der unterordner gelöscht wird (ordner und unterordner haben die rechte 777, wenn sie erstellt werden) und der übergeordnete ordner bleibt bestehen!

          komisches phänomen!

          Kommentar


          • #6
            Zitat von Gamer20 Beitrag anzeigen
            also ich habe das jetzt paar mal getestet und zu 50% wirds gelöscht und dann passierts auch mal, das NUR der unterordner gelöscht wird (ordner und unterordner haben die rechte 777, wenn sie erstellt werden) und der übergeordnete ordner bleibt bestehen!
            Mit den Zugriffsrechten dürfte das wenig zu tun haben.

            Hast du meine Version von rmdir() mal ausprobiert?

            komisches phänomen!
            Zitat von Gamer20 Beitrag anzeigen
            ...

            Code:
            $Z = count(scandir($VZ))-2;  // minus 2, um den punkt und den doppelpunkt abzuziehen
            $Z2 = count(scandir($VZ2))-3;// minus 3, um den punkt und den doppelpunkt abzuziehen und den unterordner
            jetzt prüfe ich ob die werte 0 ergeben

            Code:
            if($Z==0)	{rmdir($VZ);}
            if($Z2==0)	{rmdir($VZ2);}
            Ich frage mich, was var_dump($Z) und var_dump($Z2) wohl so ausgeben würde. Angenommen, der Rückgabewert von count() ist FALSE, dann ist bspw. $Z2 == 0 wahr und rmdir($VZ2) wird aufgerufen, obwohl offensichtlich das Verzeichnis nicht leer war. Aber du hast das sicherlich schon alles gecheckt, oder?
            Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

            Kommentar


            • #7
              ja das hat ich alles geprüft (ordner sind 0 byte groß, also keine versteckte datei).

              tja was solls, evtl. besteht das problem nur auf dem rechner, evtl. läufts auf dem server ohne probleme.

              deinen code werde ich mir aber mal abspeichern und wenns auf dem server auch probleme macht ,werd ich den code einbauen (will ungern soviel code einebauen, bin grad dabei, meine scripte zu kürzen)!
              Zuletzt geändert von Gamer20; 15.11.2009, 19:23.

              Kommentar


              • #8
                OffTopic:
                Zitat von Gamer20 Beitrag anzeigen
                tja was solls, evtl. besteht das problem nur auf dem rechner, evtl. läufts auf dem server ohne probleme.
                Ja, das ist die richtige Einstellung - in irgendeinem Paralleluniversum wird mein Code schon funktionieren, also warum soll ich in diesem hier nach Fehlern suchen ...
                I don't believe in rebirth. Actually, I never did in my whole lives.

                Kommentar

                Lädt...
                X