【PHP】ファイルコピーツールを作ってみよう

#はじめに
PHPでツール作成の二回目です。
今回はファイルコピーツールを作成していきたいと思います。

#ツール動作イメージ
ツールの動作イメージです。
![qiita_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/740996/32637031-344f-38b6-2b64-bc1f63413358.png)
コピー元フォルダにある指定したファイルをコピー先フォルダへコピーするといった動作になります。

#ツール要件
今回のツールの要件は以下とします。

- コピー元、コピー先フォルダは絶対パスでプログラム内部で定義する
- コピー元、コピー先フォルダ、コピーファイル一覧テキストファイルが存在しない場合はエラーメッセージを表示し終了する
- コピー対象ファイルの一覧は「<b>file_list.txt</b>」の中に改行区切り(CRLF)で記載する
- 「<b>file_list.txt</b>」に記載されているファイルが存在しなかった場合はコピーを実行せず、次のファイルを参照する
- スクリプト実行後「<b>コピー元フォルダパス</b>」「<b>コピー先フォルダパス</b>」「<b>コピーしたファイル数</b>」を出力する

上記の要件を基に自力で作れる方はぜひ作ってみて下さい。
サンプルコードは以下になります。※クリックで開きます
<details><summary>サンプルコード</summary><div>

```php:file_copy.php
<?php
//------------------------------------------------------
// 
// [スクリプト概要]
// テキストファイルの一覧にあるファイルを特定のフォルダへコピーする
// 
//------------------------------------------------------

$fromFolder = "C:\\xampp\\htdocs\\php_copy_tool\\from";	// コピー元フォルダ
$toFolder = "C:\\xampp\\htdocs\\php_copy_tool\\to";		// コピー先フォルダ
$loadFileName = "./file_list.txt";			// ファイルリスト

// エラーチェック
$errorMessage = "";

if( !file_exists($fromFolder) ){
	$errorMessage .= "「".$fromFolder."」フォルダが見つかりません\n";
}
if( !file_exists($toFolder) ){
	$errorMessage .= "「".$toFolder."」フォルダが見つかりません\n";
}
if( !file_exists($loadFileName) ){
	$errorMessage .= "「".$loadFileName."」ファイルが見つかりません\n";
}

if( $errorMessage != "" ){
	echo "[エラー]\n";
	echo $errorMessage;
	return;
}

// ファイルリスト読み込み
$file = file_get_contents( $loadFileName );
$fileList = explode( "\r\n", $file );

$copyFileNum = 0;	// 実際にコピーしたファイル数

echo "-----[ファイルコピー開始]-----\n";

// ファイルコピー実行
for( $i=0; $i<count($fileList); $i++ ){
	$copyFile = "".$fromFolder."\\".$fileList[$i]."";
	if( !file_exists($copyFile) ){	// ファイルが存在しなかった場合は処理しない
		continue;
	}
	$copyFileNum++;
	$distFile = "".$toFolder."\\".$fileList[$i]."";
	copy( $copyFile, $distFile );
}
echo "コピー元フォルダ：".$fromFolder."\n";
echo "コピー先フォルダ：".$toFolder."\n";
echo "コピーファイル数：".$copyFileNum."\n";
echo "-----[ファイルコピー終了]-----\n";

?>
```
</div></details>

#コード解説
コードを見れば大体分かるかと思いますが、以下の処理を実行しています

- 13～30行目・・フォルダやファイルが存在するかチェックし、一つでも存在しなかったらエラーメッセージを表示し終了しています。
- 32～34行目・・ファイルリストを読み込んでいます。改行コードがCRLFなので\r\n区切りで配列にしています。
- 40～49行目・・ファイルをコピーしています。


#その他(デバッグ手法について)
プログラムを作成していて実行するとエラーが発生し、上手く実行出来ないことがあると思います。
デバッグについては人によって様々な手法、考え方があると思いますが、私は良く以下の方法を使っています。

1.<b>exit</b>
特定の箇所まで実行し、正常に動作するか確認する時に使用します。
最初から最後まで一気に実行し、一回で上手く動作することはあまり無いと思います。
そういった時は一気に実行せず、特定の箇所まで実行したらそこでプログラムをストップし、そこまで正常に動作しているか確認すると良いです。
PHPでは「<b>exit;</b>」と記述すると、そこに来た時点でスクリプトを停止させることが出来ます。

2.<b>var_dump</b>
変数の中身が想定通りになっているか確認する時に使用します。 
上手く動かない原因として、変数に自分が想定した値が入っていないといったことが良くあります。
そういった時は<b>var_dump(変数名);</b>と記述すると、その変数の中身が表示出来ます。
配列変数なども表示出来るので非常に便利です。

以下のように使用します。

```php:debug.php
<?php
$loadFileName = "./file_list.txt";
$file = file_get_contents( $loadFileName );
$fileList = explode( "\r\n", $file );
var_dump( $fileList );
exit;
?>
```
実行すると、こんな感じで変数の中身が表示されます。
配列の要素数やそれぞれの要素の値などが全て出力されていることが分かると思います。
![qiita_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/740996/eb867de8-f4a3-606e-597c-8f1228040f8e.png)

#最後に
PHPを使用して簡単にWindows環境で動作するツールが作成出来ることが理解出来たかと思います。
[環境構築](https://qiita.com/noji505/items/24f1a98d778d462f540b)も楽に出来るので是非作ってみて下さい。