2016-06-16 4 views
1

Ich versuche, mehrere Dateien von einer Domäne auf einem Webserver zu einem anderen zu kopieren mit Kopie() und eine Liste von Dateien durchläuft, aber es kopiert nur die letzte Datei in der Liste.Verwenden Sie copy() in einer foreach-Schleife, um mehrere Dateien zu kopieren. Php

Hier ist der Inhalt von Dateien-list.txt:

/templates/template.php 
/admin/admin.css 
/admin/codeSnippets.php 
/admin/editPage.php 
/admin/index.php 
/admin/functions.php 
/admin/style.php 
/admin/editPost.php 
/admin/createPage.php 
/admin/createPost.php 
/admin/configuration.php 

Dieses Skript wird auf der Website, dass ich versuche, um die Dateien zu kopieren. Hier ist das Skript:

$filesList = file_get_contents("http://copyfromhere.com/copythesefiles/files-list.txt"); 
$filesArray = explode("\n", $filesList); 

foreach($filesArray as $file) { 
    $filename = trim('http://copyfromhere.com/copythesefiles' . $file); 

    $dest = "destFolder" . $file; 

    if([email protected]($filename, $dest)) 
    { 
     $errors= error_get_last(); 
     echo "COPY ERROR: ".$errors['type']; 
     echo "<br />\n".$errors['message']; 
    } else { 
     echo "$filename copied to $dest from remote!<br/>"; 
    } 
} 

Ich erhalte die bestätigende Nachricht für jede Datei einzeln nur, wie ich soll, aber wenn ich das Verzeichnis überprüfen, nur die letzte Datei von Dateien-list.txt ist da. Ich habe versucht, die Reihenfolge zu ändern, daher weiß ich, dass das Problem im Skript liegt, nicht in einer einzelnen Datei.

Die Ausgabe aus der Echo Aussagen sieht ungefähr so ​​aus:

http://copyfromhere.com/copythesefiles/admin/admin.css copied to updates/admin/editPage.php from remote! 
http://copyfromhere.com/copythesefiles/admin/admin.css copied to updates/admin/editPost.php from remote! 
http://copyfromhere.com/copythesefiles/admin/admin.css copied to updates/admin/index.php from remote! 

Etc

+1

Ich würde empfehlen, zuerst das '@' vor der Kopie zu entfernen, da Sie keinen legitimen Grund haben, Warnungen/Fehler hier zu unterdrücken. Als nächstes überprüfen Sie das PHP-Fehlerprotokoll auf Ihrem Server, um zu sehen, ob Sie irgendwelche Hinweise erhalten. –

+0

Die 'foreach'-Schleife wird nie geschlossen, ich nehme an, dass es in Ihrem tatsächlichen Code ist? –

+0

Gutes Auge. Ich habe vergessen, die "foreach" im obigen Code zu schließen, aber ich habe diesen Fehler nicht im eigentlichen Code gemacht. – Ethan

Antwort

1

Ich habe Ihren Code leicht modifiziert und auf meinem lokalen Dev-Server getestet. Die folgende scheint zu funktionieren:

$fileURL = 'http://copyfromhere.com/copythesefiles'; 
$filesArray = file("$fileURL/files-list.txt", FILE_IGNORE_NEW_LINES); 
foreach ($filesArray as $file) { 
    $fileName = "$fileURL/$file"; 
    $dest = str_replace($fileURL, 'destFolder', $fileName); 
    if (!copy($fileName, $dest)) { 
    $errors= error_get_last(); 
    echo "COPY ERROR: ".$errors['type']; 
    echo "<br />\n".$errors['message']; 
    } 
    else { 
    echo "$fileName copied to $dest from remote!<br/>"; 
    } 
} 

Dies verwendet die gleiche Verlegenheit, dass Mark B wies darauf hin, aber auch der Code ein wenig konsolidiert.

+1

Das scheint zu habe den Trick gemacht. Wenn ich Ihren Code fast vollständig unverändert ausführte, funktionierte es, aber es hatte ein doppeltes // zwischen dem untersten Verzeichnis ("// admin" und "// templates") und den höheren, also änderte ich '$ filename =" $ fileURL/$ file "' zu '" $ fileURL ". "$ file" 'und das hat es geklärt. Ich habe bemerkt, dass Sie Anführungszeichen verwendet haben und ich nicht. Das hat nicht den Unterschied gemacht. Ich weiß nicht, was den Unterschied ausgemacht hat, aber deiner hat funktioniert und meiner nicht, also danke! – Ethan

1

Es sei denn, die Daten, die Sie von diesem entfernten Standort sind Holen haben / im Pfad/Dateinamen führt, du bist nicht zu erzeugen richtigen Pfade:

$file = 'foo.txt'; // example only 
$dest = "destFolder" . $file; 

produziert destFolderfoo.txt, und Sie Ihr Skript Arbeitsverzeichnis mit einem bu Ende Littering nch wonky Dateinamen. Vielleicht wollten Sie

$dest = 'destFolder/' . $file; 
        ^----note this 

stattdessen.

+0

Danke. Ich habe darüber nachgedacht, aber alle Zeilen in files-list.txt beginnen mit einem Schrägstrich, also ist der Pfad/Dateiname korrekt, wenn er in das durchgeloopte Array explodiert. Wenn das das Problem wäre, würde keine der Dateien kopieren. So wie es aussieht, kopiert der letzte auf der Liste. Hier ist, was die Ausgabe, die ich von den Echo-Anweisungen bekomme, wie folgt aussieht: 'http://copyfromhere.com/copythesefiles/admin/admin.css kopiert zu updates/admin/admin.css von remote!' – Ethan