Ich habe versucht, den gesamten Inhalt des Verzeichnisses mit an einen anderen Speicherort zu kopieren
copy ("old_location/*.*","new_location/");
aber es heißt, es kann keinen Stream finden, true *.*
wird nicht gefunden.
Jeder andere Weg
Danke Dave
"old_location/."
das nur ein Tippfehler war?"old_location/*.*
. Ich kann keine Revision finden, die enthält"old_location/."
.copy ("old_location/.","new_location/");
Antworten:
Es scheint , dass Kopie nur behandeln einzelne Dateien . Hier ist eine Funktion zum rekursiven Kopieren, die ich in diesem Hinweis auf der Seite zum Kopieren der Dokumentation gefunden habe :
quelle
@mkdir
stattmkdir
?Wie hier beschrieben , ist dies ein weiterer Ansatz, der sich auch um Symlinks kümmert:
quelle
mkdir
solltetrue
als letzter Parameter hinzugefügt werden, um rekursives Verzeichnis zu unterstützen, dann ist dieses Skript perfektcopy ("old_location/*.*","new_location/");
Funktioniert das? Was ist, wenn Sie Punktdateien haben, werden diese abgeglichen?copy () funktioniert nur mit Dateien.
Sowohl der DOS-Kopierbefehl als auch der Unix-cp-Befehl werden rekursiv kopiert. Die schnellste Lösung besteht also darin, diese zu berappen und zu verwenden. z.B
Andernfalls müssen Sie das
opendir
/readdir
oder verwendenscandir
, um den Inhalt des Verzeichnisses zu lesen, die Ergebnisse zu durchlaufen. Wenn is_dir für jedes Verzeichnis true zurückgibt, können Sie darauf zurückgreifen.z.B
quelle
function xcopy($src, $dest) { foreach (scandir($src) as $file) { $srcfile = rtrim($src, '/') .'/'. $file; $destfile = rtrim($dest, '/') .'/'. $file; if (!is_readable($srcfile)) { continue; } if ($file != '.' && $file != '..') { if (is_dir($srcfile)) { if (!file_exists($destfile)) { mkdir($destfile); } xcopy($srcfile, $destfile); } else { copy($srcfile, $destfile); } } } }
Die beste Lösung ist!
quelle
shell_exec
odercp
. Das macht es meiner Meinung nach kaum zur "besten" Lösung.cp
es sich um einen Linux-Befehl handelt. Für Windowsxcopy dir1 dir2 /e /i
, wo/e
für das Kopieren leerer Verzeichnisse und/i
für das Ignorieren von Fragen zu Dateien oder Verzeichnissen stehtquelle
Wie an anderer Stelle gesagt,
copy
funktioniert nur mit einer einzigen Datei als Quelle und nicht mit einem Muster. Wenn Sie nach Muster kopieren möchten,glob
bestimmen Sie die Dateien und führen Sie die Kopie aus. Dadurch werden jedoch weder Unterverzeichnisse kopiert noch das Zielverzeichnis erstellt.quelle
Machen Sie dies aus der letzten 4. Zeile
und
quelle
Ein voller Dank geht an Felix Kling für seine hervorragende Antwort, die ich dankbar in meinem Code verwendet habe. Ich biete eine kleine Verbesserung eines booleschen Rückgabewerts an, um Erfolg oder Misserfolg zu melden:
quelle
Mit Symfony ist dies sehr einfach zu erreichen:
Siehe https://symfony.com/doc/current/components/filesystem.html
quelle
Meine beschnittene Version der @ Kzoty-Antwort. Vielen Dank, Kzoty.
Verwendung
quelle
Ich klone das gesamte Verzeichnis mit SPL Directory Iterator.
quelle
quelle
Für Linux-Server benötigen Sie nur eine Codezeile, um rekursiv zu kopieren und dabei die Berechtigung beizubehalten:
Eine andere Möglichkeit ist:
Es ist jedoch langsamer und behält keine Berechtigungen bei.
quelle
Ich hatte eine ähnliche Situation, in der ich auf demselben Server von einer Domain auf eine andere kopieren musste. Genau das hat in meinem Fall funktioniert. Sie können es auch an Ihre anpassen:
Beachten Sie die Verwendung von "substr ()". Ohne diese Option wird das Ziel zu "/home/user/abcde.com/../folder/", was Sie möglicherweise nicht möchten. Also habe ich substr () verwendet, um die ersten 3 Zeichen (../) zu entfernen, um das gewünschte Ziel zu erhalten, nämlich '/home/user/abcde.com/folder/'. So können Sie die Funktion substr () und auch die Funktion glob () anpassen, bis sie Ihren persönlichen Anforderungen entspricht. Hoffe das hilft.
quelle