ディレクトリーを再帰的にコピーする - PHP5 プログラミング

PROGRAM


ディレクトリーを再帰的にコピーする

PHP5 で、あるディレクトリーを、中に格納されているファイルやフォルダーもまとめてコピーしたい場合には、ディレクトリーの中身を辿りながら、格納されているファイルを順次コピーして行くことになると思います。

 

それを実現するために、次のようなプログラムを作成する感じになります。

使い方としては $source にコピー元のファイルまたはディレクトリーを、$target にコピー先のファイルまたはディレクトリーを指定して、関数 recursiveCopy を呼び出す形になります。

function recursiveCopy($source, $target)

{

if (is_dir($source))

{

// $source がディレクトリーの場合は、そのコピーを行います。

 

// ディレクトリーを開きます。

$dir = opendir($source);

 

// "コピー元 => コピー先" という形でコピー候補を保存する連想配列を用意します。

$children = array();

 

// コピー対象をリストアップします。

while ($file = readdir($dir))

{

// カレント (.) や親 (..) でなければ、コピー対象とします。

if ($file !== '.' && $file !== '..')

{

// readdir では名前のみが取得されるため、パス情報を付加して、コピー候補として $children に格納します。

$children[$source . DIRECTORY_SEPARATOR . $file] = $target . DIRECTORY_SEPARATOR . $file;

}

}

 

// ディレクトリーを閉じます。

closedir($dir);

 

// コピー先が存在しない場合に、ディレクトリーを作成します。

if (!file_exists($target)

{

mkdir($target, 0777, true);

}

 

// コピー候補として挙げられたファイルやディレクトリーを当関数で再帰的にコピーします。

foreach ($children as $childSource => $childTarget)

{

recursiveCopy($childSource, $childTarget);

}

}

else

{

// コピー元がファイルの場合はそれをコピー先に複製します。

copy($source, $target);

}

}

このようなコードで、フォルダー内のファイルを丸ごとコピーすることができると思います。

なお、上記のコードでは、正しくコピーできたかどうかなど、エラーがあった場合の処理が含まれていないので、実際に使用する際にはそういった処理も適宜追加する必要があると思います。


[ もどる ]