首先,PHP需要先支持使用 iconv函数(在php.ini文件中有配置 iconv 的地方)
以下几种遍历,返回值得形式有所不同:
<?php //队列方式遍历文件夹(结果为一维数组,值既有文件,又有子文件夹) function read_dir_queue($dir){ $dir=iconv("utf-8","gb2312",$dir); $files=array(); $queue=array($dir); while($data=each($queue)){ $path=$data['value']; if(is_dir($path) && $handle=opendir($path)){ while($file=readdir($handle)){ if($file=='.'||$file=='..') continue; $files[] = $real_path=$path.'/'.$file; if (is_dir($real_path)) $queue[] = $real_path; } } closedir($handle); } $arr=array(); foreach($files as $v){ $a=iconv("gb2312","utf-8",$v); $arr[]=$a; } return $arr; } //只保留file的队列数组,不包括子文件夹 function read_dir_files($dir){ $dir=iconv("utf-8","gb2312",$dir); $files=array(); $queue=array($dir); $files2=array(); while($data=each($queue)){ $path=$data['value']; if(is_dir($path) && $handle=opendir($path)){ while($file=readdir($handle)){ if($file=='.'||$file=='..') continue; $files[] = $real_path=$path.'/'.$file; if (is_dir($real_path)) $queue[] = $real_path; } } closedir($handle); } foreach($files as $v){ if(is_dir($v)){ continue; }else{ $files2[]=$v; } } $arr=array(); foreach($files2 as $v){ $a=iconv("gb2312","utf-8",$v); $arr[]=$a; } return $arr; } //返回结果为数组,值为文件名(不包括文件的目录、子文件夹) function read_dir_files1($dir){ $dir=iconv("utf-8","gb2312",$dir); $files=array(); $queue=array($dir); $files2=array(); while($data=each($queue)){ $path=$data['value']; if(is_dir($path) && $handle=opendir($path)){ while($file=readdir($handle)){ if($file=='.'||$file=='..') continue; $files[] = $real_path=$path.'/'.$file; if (is_dir($real_path)) $queue[] = $real_path; } } closedir($handle); } foreach($files as $v){ if(!is_dir($v)){ $a=explode("/",$v); $s=end($a); $files2[]=$s; } } $arr=array(); foreach($files2 as $v){ $b=iconv("gb2312","utf-8",$v); $arr[]=$b; } return $arr; }
由于windows7文件命名编码为 gb2312,PHP网页编码为UTF-8,所以需要转换:
$dir=iconv("utf-8","gb2312",$dir);
返回的结果由于是数组,要对数组中的元素逐个转换。
$arr=array(); foreach($files2 as $v){ $b=iconv("gb2312","utf-8",$v); $arr[]=$b; }