2016-06-16 26 views
1

私は、Webサーバー上のあるドメインから別のドメインにcopy()を使って複数のファイルをコピーしようとしていますが、リストの最後のファイル。複数のファイルをコピーするforeachループでcopy()を使用するphp

は、ここでファイル-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([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/>"; 
    } 
} 

私はちょうど私が必要として個別にそれぞれ、すべてのファイルのための肯定的なメッセージが表示されますが、私はディレクトリをチェックしたときに、ファイル・list.txtにから唯一の最後のファイルがあります。私は順序を変更しようとしたので、問題はスクリプトにあり、個々のファイルではないことがわかっています。あなたがそのリモートサイトからフェッチしているデータは、パス/ファイル名で/をリードしていない限り、あなたは

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! 

その他、各種

+1

警告/エラーをここで抑制する正当な理由がないので、まずコピー前に '@'を削除することをお勧めします。次に、サーバー上のPHPエラーログを調べて、あなたに手がかりを与えるかどうかを確認します。 –

+0

'foreach'ループは決して閉じられません、実際のコードにあると思いますか? –

+0

良い目。私は上記のコードで 'foreach'を閉じるのを忘れましたが、私は実際のコードで同じエラーを出しませんでした。 – Ethan

答えて

1

私はあなたのコードを少し修正し、私のローカルのdevサーバでテストしました。

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

これはマークBが指摘したのと同じ修正を使用しますが、コードを少し統合しました。

+1

トリックをやった。あなたのコードをほとんど変更せずに実行したところ、それは機能しましたが、最低レベルのディレクトリ( "// admin"と "// templates")とそれより上位のディレクトリの間に二重の//があったので、 '$ filename =" $ fileURL/$ file "を" "$ fileURL"に変更します。 "$ file" 'とそれを整理しました。私はあなたが引用符を使用していたことに気付きました。これで差が出ることはありませんでした。私は何が違いを生み出したのかは分かりませんが、あなたの仕事はうまくいっていませんでした。 – Ethan

1

だ:

は は

echo文からの出力は次のようになります適切なパスを生成しません:

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

destFolderfoo.txtを生成し、あなたは府とスクリプトの作業ディレクトリを散らかす終わりますウンキーなファイル名のnch。おそらくあなたが望むかもしれません

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

代わりに。

+0

ありがとうございます。私はそれを考えましたが、files-list.txtのすべての行はスラッシュで始まります。したがって、ループされた配列に展開されると、パス/ファイル名が正しいことになります。また、それが問題であれば、コピーするファイルはありません。リストにある最後のものがコピーされています。 echo文から得られる出力は次のようになります: 'http://copyfromhere.com/copythesefiles/admin/admin.cssはリモートからの更新/ admin/admin.cssにコピーされました! ' – Ethan

関連する問題