/**
* 遍历目录和子目录及文件
* @param string $dir
* @param int $level
*
*/
function scan_dir($dir = ".",$level = 0 ){
//判断当前路径是不是文件,如果是直接返回
static $arr = array();
if(!is_dir($dir)){
$arr[] = array(
'file' => $dir,
'level' => $level,
'type' => 'file'
);
//echo ''.$dir.'' .'
';
return;
}
//2打开目录资源
$resorc = opendir($dir);
if(!$resorc){
exit('目录打开失败');
}
//3循环遍历目录
while ($file = readdir($resorc)){
//var_dump($file); die();
//排除.和..
if ($file ==='.' || $file ==='..'){
//什么也不做
}else{
//否则就是一个文件或文件夹
//组成一个完整的路径
$path = $dir.'/'.$file;
//var_dump($path);exit();
//判断是否是一个文件
if(is_file($path)){
var_dump($path);echo '1
';
//输出文件
$arr[] = array(
'file' => $file,
'level' => $level,
'type' => 'file'
);
//echo str_repeat(" ",$level).''.$file.''.'
' ;
}else {
//输出文件夹名字
$arr[] = array(
'dir' => $dir,
'level' => $level,
'type' => 'dir'
);
//echo str_repeat(" ",$level).''.$dir.''.'
' ;
//否则是一个目录 然后递归调用函数 深层次的遍历当前遍历到的目录
scan_dir($path,$level+1);
}
}
}
return $arr;
}
$arr = scan_dir(); echo '
';
//var_dump($arr);
foreach ($arr as $value){
if($value['type'] == 'file'){
//var_dump($value['file']);
echo str_repeat(" ",$value['level']).''.$value['file'].'
';
}else{
echo str_repeat(" ",$value['level']).''.$value['dir'].'
';
}
}
输出的结果如下:
就是当前目录及子目录的文件名和目录名
digui.php
.
a.php
./sbuscan / / 这个目录下面还有一个叫subc 的目录没有输出,但是这个subc目录下面的subc.php 文件却输出了
subc.php
test.txt
请看下面的代码 我几乎是照着写的。
function myScandir($dir = ".",$level = 0){
//保存所有遍历到的文件和文件夹,要能区分父子关系
static $arr = array();
//1. 判断当前路径是否是一个目录,如果不是目录则直接返回当前文件
if(!is_dir($dir)){
//蓝色输出当前文件
//echo '' . $dir . '
';
//为了能够区分当前文件属于哪一层,使用$level来记录
$arr[] = array('level' => $level,'filename' => $dir,'type' => 'file');
//停止执行
//return 不一定需要返回值
return;
}
//2. 获取目录资源
$o = opendir($dir);
//目录打开失败处理
if(!$o){
exit('目录打开失败');
}
//3. 循环遍历目录
while($filename = readdir($o)){
//去除 . 和 ..两个文件夹
if($filename == '.' || $filename == '..'){
//什么都不干
}else{
//核心代码
//一个正常的文件:有可能是文件夹也有可能是文件
//20140622/son
//将当前遍历到的文件组成一个完整的路径
$file_dir = $dir . '/' . $filename;
//判断文件类型
if(is_file($file_dir)){
//var_dump($file_dir);echo '2
';
//是一个文件
//使用str_repeat()重复输出多个空格
//echo str_repeat(" ",$level),'' . $filename . '
';
$arr[] = array('level' => $level,'filename' => $filename,'type' => 'file');
}else{
//输出当前文件夹名字
//echo str_repeat(" ",$level),'' . $filename . '
';
$arr[] = array('level' => $level,'filename' => $filename,'type' => 'dir');
//是一个文件路径,需要进入到该路径进行深层次的遍历
//递归调用自己,把路径改成当前遍历到的目录
myScandir($file_dir,$level + 1);
// var_dump($file_dir);
}
}
}
//返回最终遍历到的数组
return $arr;
}
//return跟函数调用出是否要用变量接收没有必然关系
//如果函数没有return,就不能定义变量接收(没有意义)
$arr = myScandir();
//遍历数组,按照文件蓝色输出,文件夹红色数组,分清楚父子关系
foreach($arr as $value){
//每个$value都代表一个文件,所属哪个具体层级,到底是文件还是文件夹
if($value['type'] == 'dir'){
//当前文件是文件夹
echo str_repeat(" ",$value['level']),'' . $value['filename'] . '
';
}else{
//是一个文件
echo str_repeat(" ",$value['level']),'' . $value['filename'] . '
';
}
}
这段代码输出如下 : 是我想要的结果
digui.php
sbuscan
a.php
sbuc // 这里subc目录输出来了 我上面那段代码为什么没有输出。
subc.php
test.txt
回复讨论(解决方案)
你加点调试信息
//判断是否是一个文件 if(is_file($path)){ //var_dump($path);echo '1最后 printr($arr); 就可以看到问题所在了
'; //输出文件 $arr[] = array('path' => $path, 'file' => $file, 'level' => $level, 'type' => 'file' ); //echo str_repeat(" ",$level).''.$file.''.'
' ; }else { //输出文件夹名字 $arr[] = array('path' => $path, 'dir' => $dir, 'level' => $level, 'type' => 'dir' ); //echo str_repeat(" ",$level).''.$dir.''.'
' ; //否则是一个目录 然后递归调用函数 深层次的遍历当前遍历到的目录 scan_dir($path,$level+1); }
你加点调试信息
//判断是否是一个文件 if(is_file($path)){ //var_dump($path);echo '1最后 printr($arr); 就可以看到问题所在了
'; //输出文件 $arr[] = array('path' => $path, 'file' => $file, 'level' => $level, 'type' => 'file' ); //echo str_repeat(" ",$level).''.$file.''.'
' ; }else { //输出文件夹名字 $arr[] = array('path' => $path, 'dir' => $dir, 'level' => $level, 'type' => 'dir' ); //echo str_repeat(" ",$level).''.$dir.''.'
' ; //否则是一个目录 然后递归调用函数 深层次的遍历当前遍历到的目录 scan_dir($path,$level+1); }
你加点调试信息
//判断是否是一个文件 if(is_file($path)){ //var_dump($path);echo '1最后 printr($arr); 就可以看到问题所在了
'; //输出文件 $arr[] = array('path' => $path, 'file' => $file, 'level' => $level, 'type' => 'file' ); //echo str_repeat(" ",$level).''.$file.''.'
' ; }else { //输出文件夹名字 $arr[] = array('path' => $path, 'dir' => $dir, 'level' => $level, 'type' => 'dir' ); //echo str_repeat(" ",$level).''.$dir.''.'
' ; //否则是一个目录 然后递归调用函数 深层次的遍历当前遍历到的目录 scan_dir($path,$level+1); }
找到问题了,级别[level]有点乱,但不知道怎么解决,求指点。谢谢!
输出如下
Array
(
[0] => Array
(
[path] => ./digui.php
[file] => digui.php
[level] => 0
[type] => file
)
[1] => Array
(
[path] => ./sbuscan
[dir] => .
[level] => 0
[type] => dir
)
[2] => Array
(
[path] => ./sbuscan/a.php
[file] => a.php
[level] => 1
[type] => file
)
[3] => Array
(
[path] => ./sbuscan/sbuc
[dir] => ./sbuscan
[level] => 1
[type] => dir
)
[4] => Array
(
[path] => ./sbuscan/sbuc/subc.php
[file] => subc.php
[level] => 2
[type] => file
)
[5] => Array
(
[path] => ./test.txt
[file] => test.txt
[level] => 0
[type] => file
)
[6] => Array
(
[path] => ./tiaoshi.php
[file] => tiaoshi.php
[level] => 0
[type] => file
)
)