phpで、あるパス以下のファイル/ディレクトリリストを取得する。

任意のパス以下に存在するファイル / ディレクトリのリストを取得する関数は、たぶんこんな感じ。

<?php

function getdirlist($dirpath='' , $flag = true ){ if ( strcmp($dirpath,'')==0 ) die('dir name is undefind.'); $file_list = array(); $dir_list = array(); if( ($dir = @opendir($dirpath) ) == FALSE ) { die( "dir {$dirpath} not found."); } while ( ($file=readdir( $dir )) !== FALSE ){ if ( is_dir( "$dirpath/$file" ) ){ if( strpos( $file ,'.' ) !== 0 ){ $dir_list["$file"] = getdirlist( "$dirpath/$file" , $flag ); } }else { if( $flag ){ array_push($file_list, $file); }else{ if( strpos( $file , '.' )!==0 ) array_push( $file_list , $file); } } } return array( "file"=>$file_list , "dir"=>$dir_list); } ?>

引数 $dirpath は、中身を見たいディレクトリの相対パスまたは絶対パス。お尻にスラッシュは不要。
オプションの引数 $flag は、'.'で始まる不可視ファイルをリストに含めるかどうか。デフォルトは true (リストに含める)。

戻り値はファイル名とディレクトリ名の配列。例えば

<?php

$path = "..";

$list = getdirlist( $path );

?>

とコールすると、
 $list[ file ] に '..' 直下に存在するファイル名の配列が、
 $list[ dir ] に '..' 直下に存在するディレクトリ名の配列が、
 $list[ dir ][ dirname ][ file ] に、'..' 直下で見つかったディレクトリ 'dirname' に含まれるファイル名の配列が...。
という感じでリストが取得できる。
var_dump( $list) なり print_r( $list ) なり実行して確かめるとよろし。

PHPによるWebアプリケーションスーパーサンプル活用編 第2版
はじめてのPHPプログラミング基本編 5.3対応


これの応用で、「あるディレクトリ以下のファイル/ディレクトリを全消去する関数」はこんな感じ。

<?php

function cleanup($dirpath=''){ if ( strcmp($dirpath,'')==0 ) die('dir name is undefind.'); $file_list = array(); $dir_list = array(); if( ($dir = @opendir($dirpath) ) == FALSE ) { die( "dir {$dirpath} not found."); } while ( ($file=readdir( $dir )) !== FALSE ){ if ( is_dir( "$dirpath/$file" ) ){ array_push( $dir_list , $file); if( strpos( $file ,'.' ) !== 0 ){ $dir_list[$file] = cleanup( "$dirpath/$file" ); if ( rmdir("$dirpath/$file") ){ print "deleted -> ".$dirpath."/".$file."<br>"; }else{ die("could not delete -> [{$dirpath}/{$file}]"); } } }else { array_push( $file_list , $file ); if ( unlink("$dirpath/$file") ){ print "deleted-> ". $dirpath."/".$file."<br>"; }else{ die("could not delete -> [{$dirpath}/{$file}]"); } } } return array( "file"->$file_list , "dir"->$dir_list); } ?>

一番階層の深いディレクトリまで潜っていって、そのディレクトリ内のファイルを全削除 → そのディレクトリを削除 → いっこ上のディレクトリ内のファイルを削除 → そのディレクトリを削除 ... を繰り返す。不可視ファイルは削除されるが、不可視ディレクトリは削除されない。
もちろん、ファイル/ディレクトリに適切なパーミッションが設定されている事が前提です。


カテゴリ: