• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Problem beim kopieren von Verzeichniss-Inhalten

jminy

New member
Hallo Leute,

nachdem ihr mir gestern Nacht schon mal so toll geholfen habt, mach ich jetzt noch einmal einen Versuch Hilfe zu finden.

Wie gestern schon erwähnt, bin ich noch recht unerfahren im Umgang mit PHP und versuche mich dem Thema autodidaktisch zu nähern.
Und da geht's (zumindest bei mir) nicht ohne Hilfe von erfahrenen Leuten...

Also, jetzt zu meinem Problem. Mit viel googeln und experimentieren, ist es mir gelungen, ein Script zu schreiben, dass ein neues Verzeichnis anlegt und dabei gleich den Inhalt eines bereits vorhandenen Verzeichnisses (inklusive Unterverzeichnisse und deren Inhalt) in das neu angelegte Verzeichnis reinkopieren soll. Das funktioniert (leider) nur teilweise.

Dateien aus dem Quellverzeichnis (VORLAGE) werden kopiert, Unterverzeichnisse auch. Nur der Inhalt der Unterverzeichnisse wird nicht mitkopiert.
Alle Versuche diesen Fehler zu korrigieren schlugen fehl. Ich (dusselige Kuh?) finde einfach keine Lösung.
Kann mir jemand von Euch sagen, was ich falsch mache, bzw. übersehen habe?

Damit ihr leichter nachvollziehen könnt, was ich da gemacht habe, poste ich die den kompletten Quelltext und nicht nur einen Code-Schnipsel.

Nun hoffe ich sehr, dass ihr mir helfen könnt und danke Euch schon mal im Voraus für Euer "Erbarmen".

Liebe Grüße, Sarah :(

Hier der Queltext:
PHP:
<?php
if($_POST)
{
$dest = $_POST['ordner_name'];
$verz=opendir ('.');
while ($file = readdir ($verz)) {
if($file != "." && $file != "..")
$content = $file;
$zeichen = '.';
$pos = strpos($content, $zeichen);
if ($file != '.')
if ($file != '..')
if ($pos === false)
if ($file == $dest)
{
echo "<table style='width:100%;height:95%'>
<tr valign='middle'>
<td><center><font color='red'>Der Ordner<b> ".$dest." </b>ist bereits vorhanden.</font>
<br><a href='javascript:self.close()'>Fenster schließen</a></center>
</td></tr></table>";
exit;
} 
}
closedir($verz);

// ab hier der Teil der der den neuen Ordner anlegt 
// und die Dateien und Verzeichnisse  aus der VORLAGE kopieren soll

$source='VORLAGE'; 
$gb_config = $dest.'/config.inc.php'; 
mkdir ($dest, 0777); 
$folder = opendir($source); 
while($file = readdir($folder)) 
{ 
if ($file == '.' || $file == '..') { 
continue; 
} 
if(is_dir($source.'/'.$file)) 
{ 
mkdir($dest.'/'.$file,0777); 
copy($source.'/'.$file,$dest.'/'.$file); 
} 
else 
{ 
copy($source.'/'.$file,$dest.'/'.$file); 
} 
} 
closedir($folder); 

$fp=fopen($gb_config,'w'); 

fwrite($fp, $INHALT); 
fclose($fp); 
echo "<center><table style='width:100%;height:95%' border=0>
<tr valign='middle'>
<td><font color='#008000'>
<center>Der Ordner <b>".$dest. " </b>wurde angelegt.</font></center>
</td>
</tr><tr style='height:20px'>
<td><center><a href='javascript:self.close()'>Fenster schließen</a></center>
</td></tr></table>";
exit;
}
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</style>
</head>
<body>
<center>
<table border=0 cellpadding=4 cellspacing=0 style="width:520px;height:250px">
<tr>
<td colspan="2"><font size="-1"><center>
<b>Einen neuen Ordner anlegen</b><br></center><br>
<hr size="1" color="#000080" width="100%"><br>
<form action="<?php print $_SERVER['PHP_SELF']; ?>" method="post" name="Formular">
</td>
</tr>

<tr>
<td width="280"><div align="right">Namen es neuen Ordners hier eingeben:</div>
</td>
<td width="240">
<input type="text" name="ordner_name" maxlenght="12" style="width:150px;background-color:#FFFFFF;color:black;font-size:10px;border: 1px solid #505050;">
</td>
</tr>

<tr>
<td colspan="2"><center>
<hr size="1" color="#000080" width="100%"><br>
<input TYPE="SUBMIT" NAME="submit" VALUE="Den neuen Ordner jetzt anlegen"  style="font-size:9pt;background-color:#D0D0D0;color:black;width:250px;height:19px;border: solid 1 px black;cursor:hand" onmouseover="this.style.backgroundColor='#FFFFFF';" onmouseout="this.style.backgroundColor='#D0D0D0';">
</center>
</form>
</td>
</tr>
</table>
</center>

</body>
</html>
 
Zuletzt bearbeitet von einem Moderator:
Ich würde den Code erstmal gescheit formatieren (sprich Einrücken und Klammern), der sieht ja grauselig aus. Und diese ganzen geschachtelten IFs sehen auch nicht gerade gesund aus.
 
Seltsamer Code. Nehmen wir uns die Schleife vor, in der du die Verzeichniseinträge durchgehst um sie zu kopieren.
PHP:
	while($file = readdir($folder))
	{
		if ($file == '.' || $file == '..') {
			continue;
		}
		if(is_dir($source.'/'.$file))
		{
			mkdir($dest.'/'.$file,0777);
			copy($source.'/'.$file,$dest.'/'.$file);
		}
		else
		{
			copy($source.'/'.$file,$dest.'/'.$file);
		}
	}
Wenn du auf ein Unterverzeichnis stosst, erstellst du es am Zielort ebenfalls. So weit, so gut. Dann jedoch kopierst du das Verzeichnis als wäre es eine Datei mit copy(). Wahrscheinlich beabsichtigst du damit, alle Dateien darin zu kopieren, was aber nicht funktioniert auf diese Weise, da copy() wie gesagt nur einzelne Dateien kopiert.

Willst du ein ganzes Verzeichnis mitsamt Unterverzeichnissen (unbegrenzte Dimensionszahl, das heisst auch alle Unterverzeichnisse der Unterverzeichnisse mit Dateien) kopieren, empfiehlt sich eine rekursive Funktion, die sich bis zum letzten Verzeichnis durchhangelt und so von hinten beginnt zu kopieren. Google findet dazu auf jeden Fall etwas.

Grüsse
jeko
 
Hallo Ihr netten "Helferlein",

erst mal vielen Dank füe Eure Antworten.

1.)
Mit dem Code hast Du (Albu) natürlich recht, was die Übersichtlichkeit betrifft.
Deshalb habe ich denselben hier jetzt noch mal gepostet, reduziert aufs Wesentliche.

2.)
Dein (jeko) Hinweis auf das eine rekursive Funktion zum kopieren ist sicher auch richtig. Habe ich beim goggeln auch schon verschiedenes gefunden. Nur leider hat es mir Anfängerin noch nicht wirklich weitergeholfen.
Ich habe es einfch nicht geschafft, das Gefundene in meinem Script umzusetzen (bin ja noch am Anfang und beim Lernen).
Alle Versuche sind deshalb bisher noch gescheitert.

Vielleicht könnt ihr mir ein funktioiierendes Beispiel aufzeigen und, was noch toller wäre, es so zu kommentieren, dass ich es verstehe und damit auchecht was lerne...

Wäre echt seeehr lieb von Euch...

Danke schon mal im Voraus und liebe Grüße,
Sarah

PS: hier nochmal der aufs Wesentliche reduzierte Code
Code:
<?php

$source='VORLAGE'; 
$gb_config = $dest.'/config.inc.php'; 

mkdir ($dest, 0777);
$folder = opendir($source); 

while($file = readdir($folder)) 
	{ 
		if ($file == '.' || $file == '..') 
			{
			continue; 
			} 
	
		if(is_dir($source.'/'.$file)) 
			{ 
			mkdir($dest.'/'.$file,0777); 
			copy($source.'/'.$file,$dest.'/'.$file); 
			} 
		else 
			{ 
			copy($source.'/'.$file,$dest.'/'.$file); 
			} 
	} 
closedir($folder); 

$fp=fopen($gb_config,'w'); 

	fwrite($fp, $INHALT); 
	fclose($fp); 

echo "Das Verzeichnis wurde angelegt";
?>
 
Die Funktion auf Recursive Copy Function scheint dafür geeignet (ungetestet).

PHP:
<?php
function COPY_RECURSIVE_DIRS($dirsource, $dirdest)
{
	// recursive function to copy
	// all subdirectories and contents:
	if(is_dir($dirsource))$dir_handle=opendir($dirsource);
	mkdir($dirdest."/".$dirsource, 0750);
	while($file=readdir($dir_handle))
	{
		if($file!="." && $file!="..")
		{
			if(!is_dir($dirsource."/".$file)) copy ($dirsource."/".$file, $dirdest."/".$dirsource."/".$file);
			else COPY_RECURSIVE_DIRS($dirsource."/".$file, $dirdest);
		}
	}
	closedir($dir_handle);
	return true;
}

// Beispiel: /alt/ nach /neu/
if (COPY_RECURSIVE_DIRS("/alt/","/neu/")) echo "Erfolgreich kopiert.";
else "Es trat ein Fehler beim Kopieren des Verzeichnisses auf.";
 
Vielen Dank jeko, für Deine Mühe,

nur, leider, geht mit dem Script garnix. Wahrscheinlich bin ich doch zu dooooof...!?

Wenn's so weitergeht, verzweifle ich bald. Egal was ich auch mache, mit was auch immer von all dem was ich mir ergoogelt habe, nix geht....
ICH VERSTEH'S EINFACH NICHT !


Nachtrag: von 21.14 Uhr

Fällt nicht doch noch jemandem die richtige Lösung ein ?

Ich bin mir gaaaanz sicher, dass mehr als nur einer von Euch Profis in der Lage ist mir zu helfen.
Bitte. Alleine komme ich einfach nicht weiter ...!

Schon wieder habe ich Stunden experimentiert, ohne Erfolg. Das ist frustrierend... (grrrrrrrrr)
 
Zuletzt bearbeitet:
Hallo ele,

erst einmal vielen Dank, dass Du mir Deine Hilfe anbietest und auch danke für den Tip (und den Link dazu).
Ich hatte mir diese Seite bereits schon 'ergoogelt' und mit verschiedenen Scripten herum experimentiert. Leider ohne Erfolg.

Zu einem Beispiel habe ich den Code nachstehend gepostet. Aber damit läuft's (leider) auch (noch) nicht
Was wahrscheinlich daran liegt, dass ich nicht genau weiß, in welcher Weise ich dort meine "Pfade" und "Verzeichnisnamen" definieren muss.

Hier erst mal das Script (von Der Seite, deren Link Du mir empfohlen hast):

Code:
<?php

[SIZE="1"]  // copy a directory and all subdirectories and files (recursive)
  // void dircpy( str 'source directory', str 'destination directory' [, bool 'overwrite existing files'] )[/SIZE]

function dircpy($basePath, $source, $dest, $overwrite = false){
    if(!is_dir($basePath . $dest)) //Lets just make sure our new folder is already created. Alright so its not efficient to check each time... bite me
    mkdir($basePath . $dest);
    if($handle = opendir($basePath . $source)){        // if the folder exploration is sucsessful, continue
        while(false !== ($file = readdir($handle))){ // as long as storing the next file to $file is successful, continue
            if($file != '.' && $file != '..'){
                $path = $source . '/' . $file;
                if(is_file($basePath . $path)){
                    if(!is_file($basePath . $dest . '/' . $file) || $overwrite)
                    if(!@copy($basePath . $path, $basePath . $dest . '/' . $file)){
                        echo '<font color="red">File ('.$path.') could not be copied, likely a permissions problem.</font>';
                    }
                } elseif(is_dir($basePath . $path)){
                    if(!is_dir($basePath . $dest . '/' . $file))
                    mkdir($basePath . $dest . '/' . $file); // make subdirectory before subdirectory is copied
                    dircpy($basePath, $path, $dest . '/' . $file, $overwrite); //recurse!
                }
            }
        }
        closedir($handle);
    }
}

?>

In welcher Form muss ich jetzt $source, $dest und $basePath definieren?

Mein Quellerzeichnis hat den Namen VORLAGE, das anzulegende Zielverzeichnis ist bei mir bereits in der Variablen $ZIEL definiert.

Quellordner, Zielordner und das Copy-Script liegen im gleichen Verzeichnis.

Ich bin also wie folgt vorgegangen:

<?
$source = 'VORLAGE'; // Dieser Ordner exisitiert bereits
$dest = $ZIEL; // Dieser Ordner soll angelegt werden

// und ab hier folgt das Script, das ich oben gepostet habe
function dircpy($basePath, $source, $dest, $overwrite = false){
.
.
.
?>

Beim Auruf des Scriptes passiert (natürlich) NIX. Aber was (zum Teufel) mache ich falsch, weil ich es offenbar (noch) nicht verstehe.

Es wär echt supernett, wenn Du mir eine Lernhilfe geben könntest. Irgendwie schnall ich's einfach nicht ...

Bin in Südtirol bei Freunden und weil's so schön ist (jedenfalls bis zum frühen Nachmittag, ab da könnt's schlechter werden) gehen wir ein bischen an die frische Luft.
Aber so ab 14 Uhr werde ich spätestens wieder am PC sitzen. Da würde ich dann, weil die Sonne sich wahrscheinlich hinter Wolken versteckt hat, an deren Stelle weiter strahlen:eek: , weil ich meinem Lernhunger neues Futter geben kann (mit dem Nebeneffekt, dass ich eine funktionierende Lösung habe) ... :)



Erst nochmal danke und liebe Grüße, Sarah
 
Beim Auruf des Scriptes passiert (natürlich) NIX. Aber was (zum Teufel) mache ich falsch, weil ich es offenbar (noch) nicht verstehe.
Du weißt aber schon, dass man Funktionen aufrufen muss, damit sie funktionieren? Falls hast Du wohl unbewußt schon welche benutzt, aber noch nie selbst eine erstellt. Mein Tipp wäre also sich über den Sinn und die Bedeutung von Funktionen zu informieren.
 
Ich habe auch de Eindruck, dass du noch nicht genau weisst wie Funktionen funktionieren.

In deinem Beispiel kannst du die Funktion folgendermassen aufrufen:

Code:
dircpy('', 'VORLAGE', $ZIEL);

Den erste Parameter '$basedir' kannst du angeben, falls sowohl das Quell- als auch das Zielverzeichnis den gleichen Grundpfad haben. Aber das ist nicht unbedingt nötig, du kannst ihn auch leer lassen und den Pfad einfach bei $source und $dest angeben. Der vierte Parameter gibt an ob die Dateien berschrieben werden sollen, fallls sie schon existieren. Der Vorgabewert ist false, d.h. du musst ihn nur angeben wenn du möchtest dass die Dateien überschrieben werden:

Code:
dircpy('', 'VORLAGE', $ZIEL, true);

Eine genauere Beschreibung wie Funktionen funktionieren findest du hier. Nicht vergessen die Artikel zu lesen die im Inhaltsverzeichnis angegeben werden.
 
Hallo ele,

vielen Dank für die Antwort und die wahrlich einfache Lösung.
Im Übrigen: doch, doch, ich weiß (eigentlich) schon, dass man Funktionen auch aufrufen muss, damit das dazugehörige Script auch durchlaufen wird.

Aber wahrscheinlich war ich inzwischen so im Wald verirrt, dass ich vor lauter Bäumen denselbigen nicht mehr gesehen habe, sprich, in diesem Fall, habe ich, aus mir jetzt im Nahinein unerfindlichen Gründen, das kleine, aber bedeutungsvolle Wörtchen "function" am Beginn der Zeile function dircpy($basePath...
schlicht nicht zur Kenntnis genommen und habe den Fehler weiß Gott wo vermutet.
Deswegen ist Dein Hinweis, dass ich mich grundsätzlich noch mit der Funktionsweise von vielem (PHP) vertraut machen muss, durchaus berechtigt.
Wie gesagt stehe ich ja noch am Anfang....
Wäre ich schon PHP-betriebsicherer, hätte ich diesen beschämenden Anfänger-Fehler sicher nicht gemacht (Schamröte im Gesicht).
Wie gesagt stehe ich ja noch am Anfang....

Dein Hinweis (und damit Deine Hilfe) hat natürlich zu dem erwarteten Erfolg geführt: Das Sript funtioniert!!!!

Übrigens, das Wetter hat heute gehalten (es war echt geil, NUR Sonne, 6 Grad warm in 1.800 Meter Höhe) und wir waren bis vorhin unterwegs in der Natur. Ich muss zugeben, das de Aussicht dort deutlich schöner war, als der sture Blick auf den Monitor..... :))

Auf jeden Fall, vielen, vielen, lieben Dank, für die Hilfe und für die (Esels-)Geduld mit mir...

Liebe Grüße, Sarah :grin:
 
Zuletzt bearbeitet:
Zurück
Oben