在foreach循环中使用copy()复制多个文件php

时间:2016-06-16 18:50:01

标签: php foreach copy

我尝试使用copy()将多个文件从Web服务器上的一个域复制到另一个域并循环遍历文件列表,但它只复制列表中的最后一个文件。 / p>

这是files-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

此脚本在我尝试将文件复制到的网站上运行。这是脚本:

$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(!@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/>";
    }
}

我按照自己的意愿单独获取每个文件的肯定消息,但是当我检查目录时,只有files-list.txt中的最后一个文件存在。我试过更改订单,所以我知道问题在于脚本,而不是任何单个文件。

echo语句的输出如下所示:

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!

2 个答案:

答案 0 :(得分:1)

除非您从该远程站点获取的数据在路径/文件名中具有前导/,否则您无法生成正确的路径:

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

产生destFolderfoo.txt,你最终乱扔你的脚本的工作目录与一堆不稳定的文件名。也许你想要

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

代替。

答案 1 :(得分:1)

我稍微修改了您的代码,并在我的本地开发服务器上进行了测试。以下似乎有效:

$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/>";
  }
}

这使用了Mark B指出的相同修复程序,但也整合了一些代码。