PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   Projekthilfe (https://www.php-resource.de/forum/projekthilfe/)
-   -   PHP Newbie: Zu Testzwecken Ordnerstruktur mit Iteratoren kopierend erzeugen. (https://www.php-resource.de/forum/projekthilfe/93913-php-newbie-zu-testzwecken-ordnerstruktur-mit-iteratoren-kopierend-erzeugen.html)

Estrela 27-09-2008 17:02

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:
Zitat:

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 :confused:

Estrela 28-09-2008 00:26

Hallo zusammen.
Ich bin jetzt ein wenig weitergekommen.
PHP-Code:

<?php
$root 
getcwd();
$such 'php';
$b '\'; # Backslash wird leider nicht angezeigt
$TestOrdner = '
C:Program FilesxampphtdocsSantoDaimePortaltest5';

$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):
Zitat:

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

Estrela 28-09-2008 20:23

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

Estrela 29-09-2008 23:35

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 FilesxampphtdocsSantoDaimePortaltest5';

$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):
Zitat:

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

PHP-Desaster 30-09-2008 00:51

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.

Estrela 30-09-2008 19:02

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:
Zitat:

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.
Zitat:

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

PHP-Desaster 30-09-2008 21:53

Zitat:

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!

Estrela 30-09-2008 22:44

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
Zitat:

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

PHP-Desaster 30-09-2008 23:26

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.

Estrela 01-10-2008 00:00

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:

Zitat:

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.

:danke:
Gruß
Estrela

combie 01-10-2008 00:54

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'); 


Estrela 01-10-2008 18:37

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:
Zitat:

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.
:danke:

Gruß
Estrela


Alle Zeitangaben in WEZ +2. Es ist jetzt 20:25 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG