获取指定目录下的所有文件地址 【递归法】

实际目录内容 

<?php

class Solution { 
    public function forMl($dir){
        $arr = [];
        $file_arr = scandir($dir);

      foreach($file_arr as $item){
          if($item!='..'&&$item!='.'){
              $new_dir = $dir.'\\'.$item;
                if(is_dir($new_dir)){
                    $arr[$item] =$this->forMl($new_dir);
                }else{
                    $arr[] = $item;
                }
          }
      }

      clearstatcache();
      return $arr;

    }
}
$s = new Solution();
$dir = 'D:\demo';
$c = $s->forMl($dir);
var_dump($c);
?>

返回的值

函数分析:

    scandir 列出目录中的文件和目录, 其中必然返回的 . 和..表示当前目录和上级目录,是系统为了索引方便而显示。我们只获取当前目录下的文件 所以需要屏蔽掉这两种返回值

    is_dir :  函数检查指定的文件是否是目录,是返回true (注意该函数为了提高性能会缓存)

    clearstatcache:清除文件状态缓存,在此是为了清除 is_dir 留下的缓存

编码思路:

         scandir只能获取当前目录下的文件和目录 ,对于demo下的二级目录,例如 one 下面的 one1 内的目录结构无法获知,所有我们需要把 D:\demo\one 代入函数内,查询one下面的目录结构。

 所以我们只需要把文件地址代入scandir中  然后循环得到的函数,排除掉里面的 .和..  当将获取到的目录和原地址拼接起来判断是否是目录。若不是目录则是文件,只需直接放入空数组内;则直接递归

调用自己将新的地址代入进去,一直到没有目录需要再操作为止。最后再使用 clearstatcache 清理掉is_dir留下来的缓存,避免它在删除文件后依旧存在判断通过的操作。

   

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值