首先,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;
}