Verzeichnis kopieren

Azi

Erfahrenes Mitglied
Hallo,

ich versuche schon seit einer Woche, eine Funktion zu schreiben, die ein Verzeichnis kopiert. Man findet über Google oder die Tutorials.de-Suchfunktion zwar etwas, allerdings berücksichtigen alle, die ich gefunden habe, keine symbolischen Links.

Hier meine jetzige Funktion:

PHP:
	function copy_rec($src,$dest)
	{
		if(is_link($src) && !is_dir(realpath($dest)))@symlink(readlink($src),$dest);
		elseif(is_link($src))@symlink(readlink($src),$dest.'/'.$src);
		elseif(!is_dir($src) && !is_dir(realpath($dest)))@copy($src,$dest);
		elseif(!is_dir($src))@copy($src,$dest.'/'.basename($src));
		else
		{
			$dst=$dest;
			if(is_dir(realpath($dest))) $dst=$dest.'/'.$src;
			mkdir($dst,0777);
			$handle=@opendir($src);
			while($wert=@readdir($handle))
				if($wert!='.' && $wert!='..')
					copy_rec($src.'/'.$wert,$dest);
			closedir($handle);
		}
	}
 
Die Idee ist gut, aber ich würde dem Entwickler überlassen, ob der symbolischen Links folgt oder den Link kopieren will. :-)
 
Schön, aber hier bin ich der Entwickler und ich würde die symbolischen Links gerne beibehalten.
 
Ich kann nicht genau sagen, was nicht funktioniert. Wenn ich einzelne Dateien oder Links kopiere, klappt es. Alerldings werden Verzeichnisse nur zum Teil kopiert, das kann entweder an einer fehlerhaften Implementation des else-Teiles sein, oder die anderen Teile kommen mit angegebenen Ordnern nicht klar.
Ich hab hier ne Denkblockade und komm irgendwie nicht sehr weit. Ich bin die Funktion einige Male durchgegangen und finde den Fehler nicht...
 
Ich würde erst einmal in die Quellen in die Gruppen „Verzeichnis“ und „nicht Verzeichnis“ unterteilen, da diese beiden entweder eine Liste von Objekten beziehungsweise nur ein einziges Objekt sind. Dies würde ich schließlich auch mit den Zielen machen.
PHP:
function copy_rec( $src, $dest )
{
	$src = realpath($src);
	$dest = realpath($dest);
	$retVal = true;
	if( !is_readable($src) ) {
		$retVal = false;
	} else if( is_dir($src) ) {
		if( !file_exists($dest) && !is_dir($dest) ) {
			$filestat = stat($src);
			mkdir($dest, $filestat['mode']);
		}
		$handle = opendir($src);
		while( $retVal && $file = readdir($handle) ) {
			if( $file != '.' && $file != '..' ) {
				$retVal = $retVal && copy_rec($src.'/'.$file, $dest.'/'.$file);
			}
		}
		closedir($handle);
	} else if( is_file($src) ) {
		if( is_dir($dest) ) {
			$retVal = $retVal && copy($src, $dest.'/'.basename($src));
		} else {
			$retVal = $retVal && copy($src, $dest);
		}
	} else if( is_link($src) ) {
		if( is_dir($dest) ) {
			$retVal = $retVal && symlink(readlink($src), $dest.'/'.basename($src));
		} else {
			$retVal = $retVal && symlink(readlink($src), $dest);
		}
	}
	return $retVal;
}
 
Ah, vielen Dank! Und gleich viel übersichtlicher und verständlicher :)

Was hier noch fehlt, ist das Erstellen von nicht existierenden Ordnern, aber das bekomm ich auch selber gebacken ;)

Schönen Tag noch,

Azi
 
Bei mir geht es :) Danke!

Stelle mir nur gerade die Frage, warum die Unterverzeichnisse nicht kopiert werden sondern nur die Dateien :) Ist das Absicht oder habe ich was vergessen?

Source: /dateien/
Destination: /muh/ (Habe ich manuell erstellt und chmod 777 vergeben.
 
Zurück