正在阅读:

PHP读取文件夹文件列表(可多级读取)

今天想起了前几天写的一个php读取文件夹内文件列表的并返回文件路径的方法,因为前段时间用的时候只需读取两级目录,就随便写了一个,今天又彻底完善了一下,可直接递归读取文件夹内的文件夹,最终返回一维数组。当时在写这段程序的时候出现了乱码的现象。但当时已经对传进的参数进行了转码,并且可正常打印,但存到数组中之后却显示空白,经过仔细调试终于解决。

算法实现说明:

该算法核心是读取文件夹内的文件,若发现存在文件夹,就递归读取,将返回值在下面和第一级文件列表拼合,但这样最终的返回值是一个N维数组,N由文件夹的目录级数决定,所以,对返回值又进行了处理,将N维数组遍历返回一维数组。需要注意的是文件夹路径的转码问题,因为计算机读取文件夹的时候不认识中文汉字的utf8编码,所以每次中文路径都必须转为gb2312,此时计算机才认识。

主代码:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/*
 *php读取文件夹内文件及文件夹
 *参数:文件夹路径$dir,格式要求:文件夹名称后必须有“/”
 *返回值:含有文件名称和路径的一维数组
 *作者:kTWO
 *时间:2016-12-10 15:46:25
 *网址:http://www.k2zone.cn/
 */

function read($dir){
    $dir_tem=$dir;      //用于最终的路径拼接,解决乱码和不显示的bug
    $dir=iconv('utf-8', 'gb2312', $dir);    //对参数路径进行gb2312转码
    $data=scandir("$dir");    //返回指定目录中的文件和目录的数组。
    $file_arr=array();        //暂存文件列表
    $dir_arr=array();         //暂存文件夹内的文件列表
    foreach($data as $file) {
        if(is_dir($dir.$file) && $file!='.' && $file!='..'){    //判断是否是文件夹内的文件夹
              $file = iconv('gb2312' , 'utf-8' , $file);    //对中文的文件夹进行转码
              $dir_arr[]=read($dir.$file."/");      //递归读取文件夹内的文件
        }else{
              $file=iconv('gb2312' , 'utf-8' , $file );     //讲文件名转换为utf8编码,防止乱码
              $dir=iconv('gb2312' , 'utf-8' , $dir );
              if($file!='.' && $file!='..') {     //过滤
              $file_arr[]=$dir_tem.$file;}        //进行路径拼接
         }
     }
    $allFile = array_merge($file_arr,$dir_arr);   //拼合数组
    return $allFile;
}
function rebuild_array($arr){  //将多维数组变为一维数组
    static $tmp=array();      //此处为静态变量,防止递归的时候数据丢失
    for($i=0; $i<count($arr); $i++){
      if(is_array($arr[$i])) rebuild_array($arr[$i]);  //递归
      else $tmp[]=$arr[$i];
    }
    return $tmp;
}
function getFile($arr){
  $data=read($arr);
  return rebuild_array($data);
}

运行结果:

%e8%bf%90%e8%a1%8c%e7%bb%93%e6%9e%9c

使用时直接调用getFile()函数,传入路径参数即可。

 

留下脚印,证明你来过。

*

*

流汗坏笑撇嘴大兵流泪发呆抠鼻吓到偷笑得意呲牙亲亲疑问调皮可爱白眼难过愤怒惊讶鼓掌