再帰関数を使ってディレクトリ内のファイルを検出する。

こちらを参考にして、作りました^^;
以下がソースです。

<?php


/*
 *引数1 $pathにはディレクトリ、またはファイルの絶対パスを指定
 *引数2 $archiveDirは、コピー先のディレクトリ
 */
function moveFileToDir($path, $archiveDir) {

  $total_size = 0;
  //ファイル名取得
  $basename = basename($path);
  //指定されたものがファイルだった場合
  if (is_file($path)) {
    $dirLength = strlen("input/");
    $barabara = explode("/", $path);
    $dirName = $barabara[2];
    
    //先頭がspc_もしくはprc_で始まるファイルだけをコピーする
    if(strpos($basename, "spc_") === 0 || strpos($basename, "prc_") === 0){
      copy($path, $archiveDir.$basename);
      $newFileName = str_replace(".html", ".xls", $basename);
      rename($archiveDir.$basename, $archiveDir.$dirName."_".$newFileName);
    }
    return 1;
  } elseif (is_dir($path)) {
    //カレントディレクトリと上位ディレクトリを指している場合はここで終了
    if ($basename == '.' || $basename == '..') {
      return 0;
    }
    //ディレクトリ内のファイル一覧を取得
    $file_list = scandir($path);
    foreach ($file_list as $file) {
      //ディレクトリ内の各ファイルを引数にして、自分自身を呼び出す。
      moveFileToDir($path .'/'. $file, $archiveDir);
      //ブラウザのタイムアウト対策
      ob_end_clean();
      echo str_pad('',256);
      flush();
    }
  } else {
    return 0;
  }
}


$archiveDir = "choo/";

//コピー先のディレクトリを作成
if(!file_exists($archiveDir)) mkdir($archiveDir);


//関数を実行。
$inputDir = "input/asset";
echo moveFileToDir($inputDir, $archiveDir);

今回用いた主な関数達。

  • basename
  • strlen
  • explode
  • strpos⇒「特定の文字列で始まるファイル名」を探すために使用。
  • str_replace
  • rename
  • is_dir
  • 以前使ったタイムアウト防止関数(複数)