# PHP: ganze Ordner kopieren



## NiciB (23. August 2004)

Ich würde gerne über ein Formular ganze Ordner auf dem Webserver kopieren. (nicht upload)

Situation: Ich habe auf dem Webserver einen Ordner "A" mit Unterordner und Dateien. Dieser Ordner soll beim Anlegen eines neuen Users kopiert werden und unter einem anderen Namen "B" wieder abgelegt werden.

Funktioniert das irgendwie? Mit der Funktion copy() kann man ja nur einzelne Dateien kopieren...


----------



## Sebastianus (23. August 2004)

```
$verzeichnis = opendir ('.');
while ($file = readdir ($verzeichnis))  // Verzeichnis öffnen und auslesen
{
copy("ordner_a/$file","/ordner_b/$file"); // Datei kopieren und löschen
unlink("ordner_a/$file");
}
closedir($verzeichnis);
```


----------



## Radhad (23. August 2004)

Da er aber den Ordner_a nicht löschen will, sollte er dann nicht den unlink-Befehl weglassen?


MfG Radhad


----------



## Sebastianus (23. August 2004)

Der unlink Befehl bezieht sich nur auf die Datei in dem Ordner! War davon ausgegangen, dass die Inhalt verschoben werden sollten! Hab den Titel wohl beim schreiben des Posts vergessen  => muss unlink natürlich weg wenn die kopierte Datei nciht gelöscht werden soll!


----------



## NiciB (23. August 2004)

Ich hab mal ein kleines Skript geschrieben, das mir nur mal die Dateien und Ordner unterscheiden soll:

der Ordner "start" enthält folgende Dateien bzw. Ordner:
Datei: 1.txt
Datei: 2.txt
Datei: 3.txt
Datei: 4.txt
Ordner: unter_start



```
$verzeichnis = opendir ('start'); 
while ($file = readdir ($verzeichnis))  { // Verzeichnis öffnen und auslesen 
	
	if(is_file($file))
		echo "File: ".$file."<br>";
	if(is_dir($file))
		echo "Ordner: ".$file."<br>";		
}
closedir($verzeichnis);
```

da bekomme ich dann diese Ausgabe:
_
Ordner: .
Ordner: ..
_ 


Dann hab ich mal bei den beiden if-Anweisungen ein ! davor gesetzt:

```
$verzeichnis = opendir ('start'); 
while ($file = readdir ($verzeichnis))  {// Verzeichnis öffnen und auslesen 
	
	if(!is_file($file))
		echo "File: ".$file."<br>";
	if(!is_dir($file))
		echo "Ordner: ".$file."<br>";		
}
closedir($verzeichnis);
```

da bekomme ich folgende Ausgabe:

_
File: .
File: ..
File: 1.txt
Ordner: 1.txt
File: 2.txt
Ordner: 2.txt
File: 3.txt
Ordner: 3.txt
File: 4.txt
Ordner: 4.txt
File: unter_start
Ordner: unter_start
_


Ich kenn mich nicht mehr aus...


----------



## Ben Ben (23. August 2004)

Hmm eigentlich stand ja schonalles da wies geht.

Zu deienm Problem, du hast nun eine verdrehte Ausgabe, da du vor is_dir bzw is_file ein ! hast, was das ganze umdreht.
Du sagst wenn $file keine Datei ist gib Datei: aus und bei is_dir das gleiche.

Wenn du allerdings nur . und .. rausfiltern willst mach es doch folgendermassen

if( $file == '.' || $file == '..' )
       continue;

Ansonsten gibts in den Userkommentaren einige Beispielscripte, die Verzeichnisse auch rekursiv mit Unterverzeichnissen kopieren, als auch der Vorschlag beim Verschieben die Funktion rename() zu verwenden.
Die Manual-Seite findest du hier

Und ein Beispielcode der Userkomentare

```
This function will copy all entries in source diretory to destin directory recursively, including other directories.

<?php
   function copy_dir($_s_dir,$_d_dir) {
       if(!is_dir($_s_dir)) {
         return FALSE;
       }
       $_od = getcwd(); // Devemos guardar o diretório atual...
       chdir($_s_dir);
       $_d = @opendir("./");
       $_ret = TRUE;
       while (($_l=readdir($_d))!==FALSE) {
         if(substr($_l,0,1)=="." AND strlen($_l)<=2) {
             continue;
         }
         if(is_dir($_l)) {
             mkdir("$_d_dir/$_l");
             if(!copy_dir("$_s_dir/$_l","$_d_dir/$_l")) {
               $_ret = FALSE;
             }
         }
         else {
             if(!copy($_l,"$_d_dir/$_l")) {
               $_ret = FALSE;
             }
         }
       }
       closedir($_d);
       chdir($_od);
       return $_ret;
   }
?>
```


----------



## NiciB (23. August 2004)

kann es vielleicht an einer Einstellung vom Apache liegen?

Ein Bekannter hat es bei sich getestet und hat anscheinend funktioniert...

Ich habe es aber auch auf meinem PC und auf meinem Webspace getestet -> bei beiden kein Erfolg.


----------



## NiciB (23. August 2004)

ich hab dieses Skript bis jetzt geschrieben:


```
$dir="start"; 
$opendir=opendir($dir);
include("mysqldb.php");
$ziel="ziel";

mkdir($ziel);


$verzeichnis = opendir ('start'); 
chdir("start"); 
#while ($file = readdir ($verzeichnis))  {// Verzeichnis öffnen und auslesen 
while($file = readdir($verzeichnis)){	
	if(is_file($file) && $file!="." && $file!=".."){
		echo "File: ".$file."<br>";
		copy($file,"../".$ziel."/".$file);
		}
		
	else if($file!="." && $file!=".."){
		chdir($file);
		echo "Ordner: ".$file."<br>";
		mkdir("../../".$ziel."/".$file);
		$unterverzeichnis = opendir("../".$file);
		#chdir($file);
		while($file2 = readdir($unterverzeichnis)){
			if($file2!="." && $file2!=".."){
				echo $file2;
/*Zeile 48 */				copy($file2,"../../".$ziel."/".$file); }
			}
			closedir($unterverzeichnis);
		}		
}
closedir($verzeichnis);
```


das kopiert mir auch bereits die Dateien in den Ordner "ziel" und erstellt den Unterordner "unter_start". Die Dateien wo da rein kommen würden kopiert es aber nicht. Es kommt folgende Fehlermeldung:

Warning: copy(../../ziel/unter_start): failed to open stream: Permission denied in d:\homepage\test\copy.php on line 48
2a.txt
Warning: copy(../../ziel/unter_start): failed to open stream: Permission denied in d:\homepage\test\copy.php on line 48
3a.txt
Warning: copy(../../ziel/unter_start): failed to open stream: Permission denied in d:\homepage\test\copy.php on line 48 


An was liegt das?


----------



## Ben Ben (24. August 2004)

Daran das dir die Rechte fehlen dort zu schreiben.
Hmm wundert mich, da es ja scheinbar auf nem Windowssystem läuft....


----------



## NiciB (24. August 2004)

aber die anderen Dateien kann ich ja in den Ordner "start" kopieren. und den erstelle ich gleich wie ich den Ordner unter_start erstelle (mit mkdir())... dann müßten sie doch auch die gleichen schreibrechte haben, oder?

ich checks nicht mehr...


----------

