自身で作ったファイルをPHPのプログラムを使ってコピーできたら、バックアップが簡単になって楽ですよね。
今回はPHPのプログラム内で外部ファイルをコピーすることができるcopy関数をご紹介いたします。
似たような関数であるrename関数についても紹介し、copy関数との違いまでお教えします。
copy関数がよくわかっていないなら、こちらの記事を参考にしてみてくださいね。
目次
PHPのcopy関数はファイルをコピーする関数
PHPにはcopy関数という関数が存在しており、これを使えばPHPのプログラムから指定したファイルをコピーすることができます。
コピーする際、コピー先に同名ファイルがあると上書きされてしまうので、取り扱いには注意な関数です。
ここからはcopy関数の使い方をご紹介していきます。
copy関数の構文と参考例
まずはcopy関数の構文ですが、以下のようになっています。
1 |
copy(コピーする元のファイルパス名,コピー先のファイルパス名); |
コピー元・コピー先どちらもPHPが設置されているフォルダと同じ場所ならば、ファイル名だけでコピーができます。
コピー元・コピー先がPHPと別のフォルダならば、ディレクトリまで指定する必要があります。
例えばコピー元ファイルがPHPと同じフォルダで、コピー先が別フォルダならば以下の例文のようになります。
1 2 |
// 同フォルダにあるtext.txtをmemoディレクトリにコピーする copy('text.txt', 'memo/text.txt'); |
目的のファイルがPHPが設置されている場所からどの位置にあるか、どの位置にコピーするかでディレクトリの書き方が変わってくるので注意です。
戻り値を使ってコピーの成否を判定
copy関数には戻り値が設定されており、コピー成功ならtrueをコピー失敗ならfalseを返します。
これを元にif文を使ってコピーが成功したか失敗したかを判定させることができます。
以下のような例文でコピーの成否判定ができます。
1 2 3 4 5 6 7 8 |
// if文内で同フォルダにあるtext.txtをmemoディレクトリにコピーしながら成否判定 if (copy('text.txt', 'memo/text.txt')) { // コピーに成功したら以下を表示 echo 'コピー成功です。'; } else { // コピーに失敗したら以下を表示 echo 'コピー失敗です。'; } |
【初心者向け】PHPのif~elseについて解説!基本構文や省略形の書き方まで説明します
失敗した場合存在しないファイル名や指定したディレクトリが違っていたりするので、一度正しいかどうか確認しましょう。
ファイルを移動させるrename関数
copy関数はファイルを複製する関数で、コピー先のディレクトリまで指定すれば複製と同時に移動が可能です。
これと似たような関数としてrename関数が存在しています。
copy関数と同じように指定したディレクトリにファイルを移動させることができますが、copy関数とは少し仕様が違っています。
ここからはrename関数とcopy関数の違いやrename関数の使い方を紹介します。
rename関数とcopy関数の違い
rename関数とcopy関数の大きな違いは元のファイルが残るか残らないかです。
rename関数は名前の通りファイル名を書き換える(リネームする)関数なので、書き換えられたファイルは消えてしまいます。
リネーム後のファイルパス名に移動先のディレクトリ指定することで、ファイルの移動を可能にしています。
copy関数と同じようにrename関数を使ってしまうと、元のファイルが消えてしまうので注意です。
rename関数の使い方
rename関数の使い方はcopy関数と殆ど一緒で、構文も以下のようになっています。
1 |
rename(元ファイルパス名, リネーム後ファイルパス名); |
移動先に同じファイル名のファイルがあると、こちらも上書きされてしまいます。
元ファイルが消えて移動先にあったファイルに上書きされる可能性があるので、実行する前にファイル名には注意ですね。
copy関数と同じく戻り値があるので、if文を使って以下のように正否判定まで含めたプログラムが作れます。
1 2 3 4 5 6 7 8 |
// if文内で同フォルダにあるtext.txtをmemoディレクトリに移動する if(rename('text.txt', 'memo/text.txt')) { // 移動成功なら以下を表示 echo '移動成功です。'; } else { // 移動失敗なら以下を表示 echo '移動失敗です。'; } |
上記のプログラムで成功すると、実際にファイルを移動させて「移動成功です。」のメッセージが表示されます。
is_writable関数を使えば書き込みできるディレクトリか確認可能
ファイルをコピーや移動させる処理をして失敗した際、指定ディレクトリが間違えていると厄介です。
そこでファイルのコピーや移動をする前に、指定ディレクトリが存在しているかをis_writable関数で調べることができます。
以下はis_writable関数を使った例文です。
1 2 3 4 5 6 7 |
// ファイルのパスを変数に代入 $fpash = './memo/'; // if文内でis_writable関数を使ってファイルパスが存在しているか確認 if(is_writable($fpash)){ // ディレクトリ'./memo/'が存在していればtext.txtをコピーする copy('text.txt', $fpash.'text.txt'); } |
これを実行してコピーがされなかった場合、変数に代入したディレクトリが間違っていることがわかります。
opendir関数を使うことでフォルダ内全てのファイルをコピー可能
ここまで紹介したのは1つのファイルをコピーや移動させる方法です。
指定したディレクトリ内にある全てのファイルを移動させたいなら、opendir関数を応用することでできます。
opendir関数にif文&while文を組み合わせて、ディレクトリ内のファイルをループさせて順番にコピーしていきます。
【初心者向け】PHPのwhileを使ったループの仕方は?基本構文や他の制御文との違いを分かりやすく解説します。
以下のようなプログラムでディレクトリ名やファイル名が間違っていなければ、指定ディレクトリ内の全ファイルをコピーできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// 移動先のディレクトリパスとなる一つ上の階層にあるディレクトリ/memo/を変数に代入 $move_directory = '../memo/'; // PHPファイルが存在するディレクトリのハンドルがオープンできれば処理を実行 if($handle = opendir('./')){ // オープンしたディレクトリにファイルがあればループ while(false !== ($entry = readdir($handle))) { //ファイル名が「.」「..」じゃなければ処理をする if($entry != '.' && $entry != '..') { //ファイルを指定したディレクトリに移動させる copy($entry, $move_directory.$entry) } } // オープンしたディレクトリのハンドルをクローズ closedir($handle); } |
ちょっと複雑ですが、コピー元のディレクトリとコピー先のディレクトリを把握して置き換えれば、ディレクトリ内のファイルをすべてコピーできます。
【初心者向け】PHPのif文のorについて解説!基本構文や実際のコード例について説明します
まとめ
今回はPHPのcopy関数について、使い方などをご紹介しました。
併せて紹介したrename関数はcopy関数と似ていますが、用途などは違うので注意してくださいね。
しっかり理解して使い分ければ、PHPで楽にファイル操作ができるので、これから覚えていきましょう。