PHP Newbie: Zu Testzwecken Ordnerstruktur mit Iteratoren kopierend erzeugen.

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

  • PHP Newbie: Zu Testzwecken Ordnerstruktur mit Iteratoren kopierend erzeugen.

    Hallo zusammen.
    Ich möchte zu Testzwecken eine Ordnerstruktur kopieren und in meinem Testordner erzeugen, wobei alle Dateien, die sich in den Ordnern php befinden, ebenfalls kopiert werden sollen.
    Die ausführende Datei befindet sich im Ordner:
    C:\Program Files\xampp\htdocs\SantoDaimePortal\Santo_Daime\religion\heilig\Santo\Daime
    Soweit bin ich schon gekommen:

    PHP-Code:
    <?php
    $root 
    getcwd();
    $such 'php';
    $TestOrdner "C:\\Program Files\\xampp\\htdocs\\SantoDaimePortal\\test5";

    $dir_iter = new RecursiveDirectoryIterator($root);
    $files = new RecursiveIteratorIterator($dir_itertrue);

    foreach (
    $files as $file)    {
        
    $path $file->getPathname();
        if (
    is_file($path))
            continue;
        
    $path2 substr ($path,86);    
        echo 
    "$path2<br />";
    }

    ?>
    Die Ausgabe als Auszug:
    C:\Program Files\xampp\htdocs\SantoDaimePortal\Santo_Daime\religion\heilig\Santo\Daime\Joao_Pedro\mp3
    C:\Program Files\xampp\htdocs\SantoDaimePortal\Santo_Daime\religion\heilig\Santo\Daime\Joao_Pedro\php
    Jetzt wollte ich mit der Anweisung
    PHP-Code:
    $path2 substr ($path,86); 
    die ersten Ordner abschneiden, so das nur die Ordner übrigbleiben, die auch erzeugt werden sollen, hier also alles nach ...\Santo\Daime\
    Ich habe das auch schon mit str_replace versucht aber auch da erfolgte keine Reaktion.
    Das echo greift ja auf $path2 zu, die Zuweisung ist also erfolgt, aber keine Bearbeitung mit str_replace oder substr.
    Wißt ihr, woran das liegt?

    Gruß
    Estrela

    Edit// War ein kleiner Arbeitsfehler. Habe im Testordner die Datei modifiziert und über Browser die Datei im Arbeitsordner aufgerufen. Kann sich ja nix tun, ne. Sorry
    Zuletzt geändert von Estrela; 27.09.2008, 20:27.
    Denk positiv.

  • #2
    Hallo zusammen.
    Ich bin jetzt ein wenig weitergekommen.
    PHP-Code:
    <?php
    $root 
    getcwd();
    $such 'php';
    $b '\'; # Backslash wird leider nicht angezeigt
    $TestOrdner = '
    C:\\Program Files\\xampp\\htdocs\\SantoDaimePortal\\test5';

    $dir_iter = new RecursiveDirectoryIterator($root);
    $files = new RecursiveIteratorIterator($dir_iter, true);
    $i = 0;
    foreach ($files as $file)    {
        $path = $file->getPathname();
        if (is_file($path))
            continue;
        $path2 = substr ($path,86);
        $i= $i + 1;
        #$pfad = ($i.' '.$TestOrdner.$path2."<br>");
        $pfad = ($TestOrdner.$path2.$b);    
        echo $i.' '.$pfad.'
    <br>';
        $dir = mkdir ('
    $pfad' , '0777' , true);
            if ($dir) {
            echo '
    Erledigt!'.'<br>';
        }else {
        echo '
    Hat leider nicht geklappt.'.'<br>';
        }
    }

    ?>
    Leider bekomme ich jetzt folgende Warnungen (als Auszug):
    1 C:\Program Files\xampp\htdocs\SantoDaimePortal\test5\$pfad\

    Warning: mkdir() [function.mkdir]: File exists in C:\Program Files\xampp\htdocs\SantoDaimePortal\Santo_Daime\religion\heilig\Santo\Daime\3.php on line 24
    Hat leider nicht geklappt.
    2 C:\Program Files\xampp\htdocs\SantoDaimePortal\test5\Baixinha\
    Die Ordner werden also nicht angelegt.
    Kann mir jemand sagen, was nicht stimmt?

    Gruß
    Estrela
    Zuletzt geändert von Estrela; 27.09.2008, 23:57.
    Denk positiv.

    Kommentar


    • #3
      Hallo zusammen.

      Danke für euer geduldiges Schweigen.
      Das ein Unterschied zwischen ' und " besteht, war mir ja schon bekannt.
      Also hat das erzeugen der Ordner jetzt stattgefunden.
      Mache mich jetzt an den Ausnahmeordner php.

      Gruß
      Estrela
      Denk positiv.

      Kommentar


      • #4
        Hallo zusammen.
        Ich bin wieder ein wenig weiter gekommen.

        PHP-Code:
        <?php
        $root 
        getcwd();
        $such 'php';
        $b '\'; #Backslash wird leider nicht angezeigt
        $TestOrdner = '
        C:\\Program Files\\xampp\\htdocs\\SantoDaimePortal\\test5';

        $dir_iter = new RecursiveDirectoryIterator($root);
        $files = new RecursiveIteratorIterator($dir_iter, true);
        foreach ($files as $file)    {
            $path = $file->getPathname();
            if (is_file($path))
                continue;
            $path2 = substr ($path,86);
            $pfad = ($TestOrdner.$path2.$b);    
            $dir = mkdir ("$pfad" , '
        0777' , true);
                if ($dir) {
                echo '
        Erledigt!'.'<br>';
            }else {
            echo '
        Hat leider nicht geklappt.'.'<br>';
            }
                $path2a = explode ('
        Backslash',$path2);# Backslash soll das Zeichen sein,
        # wird hier leider nicht angezeigt, darum so reingeschrieben.
                $path3 = end ($path2a);
                    if ($path3 == '
        php' ){
                           if ($dh = opendir($path)) {
                                while (($file = readdir($dh)) !== false) {
                                echo $file. "<br>";
                                    copy($file, $TestOrdner.$path2);
                                }
                            closedir($dh);
                        }
                }            
        }
        ?>
        Leider bekomme ich folgende Fehlermeldung (als Auszug):
        Warning: copy() [function.copy]: The first argument to copy() function cannot be a directory in C:\Program Files\xampp\htdocs\SantoDaimePortal\Santo_Daime\religion\heilig\Santo\Daime\4.php on line 32
        01-Daime-Luz.php
        Ich verstehe die Aussage nicht, weil ja das vorlaufende echo anzeigt, das $file eine Datei ist und kein Ordner. $file ist doch als erstes Argument gemeint, oder nicht?
        Was sollte ich also verbessern, damit das script läuft?

        Gruß
        Estrela
        Zuletzt geändert von Estrela; 29.09.2008, 22:48.
        Denk positiv.

        Kommentar


        • #5
          Du hast das Echo vor dem Copy, darum ist das "01-Daime-Luz.php" schon vom nächsten Durchgang!
          Du kannst dir mal is_file ansehen

          Btw: Warum mal RecursiveDirectoryIterator und dann wieder opendir? Nicht sehr konsequent.

          Kommentar


          • #6
            Hallo PHP-Desaster.

            Ich habe die echos etwas anders positioniert:

            PHP-Code:
                                    while (($file readdir($dh)) !== false) {
                                        
            copy($file$TestOrdner.$path2); #Line 31
                                        
            echo $file"<br>";
                                        echo 
            $TestOrdner.$path2.'<br>';
                                    } 
            Jetzt habe ich folgende Fehlermeldung:
            Warning: copy(01-Daime-Luz.php) [function.copy]: failed to open stream: No such file or directory in C:\Program Files\xampp\htdocs\SantoDaimePortal\Santo_Daime\religion\heilig\Santo\Daime\5.php on line 31
            01-Daime-Luz.php
            C:\Program Files\xampp\htdocs\SantoDaimePortal\test5\Baixinha\Lumiar\php
            Zu erkennen ist ja, das die Datei richtig benannt ist und der entsprechende Ordner auch.
            Der entsprechende Ordner existiert auch, ist ja vorher erstellt worden.
            Btw: Warum mal RecursiveDirectoryIterator und dann wieder opendir? Nicht sehr konsequent.
            Wollte mal ein wenig Abwechslung reinbringen.

            Aber im Ernst. Wieder verstehe ich die Fehlermeldung nicht: "No such file or directory... "
            Das erste echo zeigt, das die Datei vorhanden ist und das zweite, das der Ordner vorhanden ist, also was will er von mir?

            Die Hauptaufgabe der Ordnererstellung ist ja erfolgt und ich habe gerade die paar php-Ordner per Hand kopiert, so das die Aufgabe erstmal erledigt ist.
            Würde mich trotzdem für zukünftige Aufgaben interessieren, wo der Fehler liegt.

            Gruß
            Estrela
            Denk positiv.

            Kommentar


            • #7
              Aber im Ernst. Wieder verstehe ich die Fehlermeldung nicht: "No such file or directory... "
              Das erste echo zeigt, das die Datei vorhanden ist und das zweite, das der Ordner vorhanden ist, also was will er von mir?
              Du hast einen Denkfehler. 01-Daime-Luz.php ist zwar die Datei, aber in $path steht der Pfad zum entsprechenden Verzeichnis. D.h. erst durch Kombination beider Elemente kommst du auf den richtigen Dateipfad!

              Kommentar


              • #8
                Hallo PHP-Desaster.

                Ach so. Du meinst, so währe es richtig:

                PHP-Code:
                copy($file$TestOrdner.$path2.'Backslash'.$file); #Backslash = Zeichen 
                Das bedeutet also, das es nicht reicht, nur den Ordner anzugeben, in den kopiert werden soll, sondern auch den Dateinamen.
                Dann besteht also gleichzeitig die Möglichkeit, die Datei umzubenennen.

                Aber, habe es gerade ausprobiert mit diesem code
                PHP-Code:
                                            copy($file$TestOrdner.$path2.'Backslash'.$file);
                                            echo 
                $file"<br>";
                                            echo 
                $TestOrdner.$path2.'Backslash'.$file.'<br>'
                Dazu die Fehlermeldung
                Warning: copy(01-Daime-Luz.php) [function.copy]: failed to open stream: No such file or directory in C:\Program Files\xampp\htdocs\SantoDaimePortal\Santo_Daime\religion\heilig\Santo\Daime\5.php on line 31
                01-Daime-Luz.php
                C:\Program Files\xampp\htdocs\SantoDaimePortal\test5\Baixinha\Lumiar\php\01-Daime-Luz.php
                Zu erkennen ist doch jetzt auch, das ein einwandfreier Pfad vorliegt.
                Oder habe ich Dich nicht richtig verstanden oder was bleibt noch zu tuen?

                Gruß
                Estrela
                Denk positiv.

                Kommentar


                • #9
                  Nein, bei dem Ziel reicht auch die Angabe eines Verzeichnisses. Entscheidend ist deine Eingabe bei der Quelle. Aktuell versucht dein Skript die Datei im aktuellen Verzeichnis zu finden. Du musst dem copy-Aufruf schon mitteilen, wo genau sich die Quelldatei befindet.

                  Kommentar


                  • #10
                    Hallo PHP-Desaster.

                    Ich habe jetzt mit einer Hilfsvariablen $pathc und dirname den Arbeitspfad extraiert:

                    PHP-Code:
                                                copy($pathc.'php\\'.$file$TestOrdner.$path2.'Backslash'.$file);
                                                echo 
                    $file"<br>";
                                                echo 
                    $TestOrdner.$path2.'\\'.$file.'<br>';
                                                echo 
                    $pathc.'BackslashphpBackslash'.$file.'<br>'
                    Aber leider bleibt die Kernaussage der Fehlermeldung bestehen:

                    Warning: copy(C:\Program Files\xampp\htdocs\SantoDaimePortal\Santo_Daime\religion\heilig\Santo\Daime\Baixinha\Lumiar01-Daime-Luz.php) [function.copy]: failed to open stream: No such file or directory in C:\Program Files\xampp\htdocs\SantoDaimePortal\Santo_Daime\religion\heilig\Santo\Daime\5.php on line 33
                    01-Daime-Luz.php
                    C:\Program Files\xampp\htdocs\SantoDaimePortal\test5\Baixinha\Lumiar\php\01-Daime-Luz.php
                    C:\Program Files\xampp\htdocs\SantoDaimePortal\Santo_Daime\religion\heilig\Santo\Daime\Baixinha\Lumiar\php\01-Daime-Luz.php
                    //Edit Hatte in copy($pathc.'php'.$file noch ein paar Backslash´s vergessen. Jetzt funktioniert alles.


                    Gruß
                    Estrela
                    Zuletzt geändert von Estrela; 30.09.2008, 23:19.
                    Denk positiv.

                    Kommentar


                    • #11
                      Ist es so nicht einfacher:
                      PHP-Code:
                      function deep_copy($quelle,$ziel)
                      {
                        if(!
                      file_exists($ziel)) mkdir($ziel,0777,TRUE);
                        foreach(
                      glob($quelle.'/*') as $ding)
                        {
                          
                      $neuequelle $quelle.'/'.basename($ding);
                          
                      $neuesziel  $ziel  .'/'.basename($ding);
                          if(
                      is_dir($ding))  deep_copy($neuequelle,$neuesziel);
                          if(
                      is_file($ding)) copy($neuequelle,$neuesziel);
                        }
                      }

                      // testcode
                      deep_copy('../quellordner','./zielordner'); 
                      Wir werden alle sterben

                      Kommentar


                      • #12
                        Hallo zusammen.
                        @ PHP-Desaster.
                        Wollte mich noch mal bei Dir für die Erweiterung meines Verständnisses bedanken.
                        Ist ja im "Laufe des Gefechts" ausgeblieben. Ich ging nähmlich implizit davon aus, das, wenn dem Script der Name der Datei bekannt ist, der Befehl copy ebenfalls auf die Datei zugreifen kann, was offensichtlich nicht der Fall ist. Danke dafür.

                        @ combie.
                        Was mir an Deinem Code gefällt, ist die einfache Klarheit, die fast schön zu nennen ist.
                        Die Zeile gefällt mir besonders:
                        PHP-Code:
                        if(is_dir($ding))  deep_copy($neuequelle,$neuesziel); 
                        Einmal wegen der Schreibweise, aber hauptsächlich durch die Darstellung der Rekursion.
                        Ich habe das Script ein wenig angepasst und dadurch zum laufen bekommen und festgestellt, das alles kopiert wird.
                        Die "Komplexität" des hier von Uns entwickelten Scriptes entstand ja hauptsächlich dadurch, das eben nicht alles, sondern alle Ordner und zusätzlich alle Dateien im Ordner php kopiert werden sollten, weil nur darin in einem anderen Script operiert werden soll.

                        Trotzdem ein sehr schönes Beispiel eines PHP Senior´s für einen Newbie, wohin die Reise geht oder gehen kann. Knapp, klar und keine Umwege.

                        Ich werde mir weiter die Grundlagen aneignen und möchte noch sagen, das ich es didaktisch sehr gut finde, nach der Erarbeitung des Scriptes eine (hier Teil-) Lösung eines Profis zu sehen, weil dadurch das bessere sichtbar wird, studierbar wird und damit dazu beiträgt, besser zu werden. Kann man wohl nicht immer machen, aber kommt gut.
                        Noch ein Wort zu:
                        Wir werden alle sterben
                        Sterben ist nicht gleich Tot. Als sterben wird der Prozess der Entleibung benannt.
                        Also das, was vorher war, entleibt sich und wird wieder das, was es vorher war plus der Erfahrung, die es mit, in und durch den Leib gemacht hat.
                        Das was ist, war und sein wird nimmt die Formen an den Orten an, die es ermöglichen, die Erfahrungen zu machen, die vonnöten sind, um die Lektionen zu lernen, die auf der jeweiligen Bewußtseinsstufe zu bestehen sind.

                        Darum möchte ich an dieser Stelle noch mal all jenen Danken, die es Uns hier ermöglichen, die Lektionen auf diesem Gebiet zu lernen dadurch, das sie ihr Wissen mitteilen und Wir es aufnehmen können.


                        Gruß
                        Estrela
                        Denk positiv.

                        Kommentar

                        Lädt...
                        X