递归及文件、目录操作记录

应作业要求,写了一个递归文件夹

列出某文件夹下的所有文件及子文件

文件夹结构如下:

《》代表文件夹

<>代表文件

文件夹:

《1120》下有:《a》《b》<11.txt><see.php>

《1120>a》下有:《ccc》<1.txt>

《1120>b》是空文件夹

《1120>a>ccc》是空文件夹

 

代码如下:

/*

function see($path){
    if(is_dir($path)){
       $dh= opendir($path);//$dh是句柄
    }else{
        echo '目录'.$path.'不存在';
        return false;
     }
    echo "<ul>";
    echo '<br ><b>',$path,'文件夹</b><hr>';
    while(($filename=readdir($dh))!==false){

//此为我的写法
        if(is_dir($path.'/'.$filename)){//1、此次出现问题
              if($filename!='.' && $filename!='..'){
                   see($path.'/'.$filename);
              }
        }else{
              echo $filename,'&nbsp;&nbsp;';
        }

//此为老师的写法

if($filename=='.' || $filename=='..'){

continue;

}

echo str_repeat('&nbsp;&nbsp;',$level),$filename,'<br />';

if(is_dir($path.'/'.$filename)){

see($path.'/'.$filename,$level+1);

}

      }

echo "</ul>";
closedir($dh);//2、忘记了关闭文件句柄
}

see('../1120');

//出现的问题:

1、判断文件夹时,出现了2层后的文件夹没能正确判断

解决方法:

原判断为if(is_dir($filename)){},当文件到第二层时(如上文件夹1120>a>ccc)就无法判断ccc是一个文件夹了,

原因:$filename是文件夹的名称,不带路径!当首层文件夹里找不到,就只能返回false了!

所以,改为if(is_dir($path.'/'.$filename)){}就可,当然,递归时也需要将参数写为$path.'/'..$filename

2、忘记了关闭文件句柄!(后来看老师及Y友写的程序时,才发觉这个大问题)

3、以上函数的目录层次不够分明!

而自己也就最后的层次问题调试了好久几个小时,包括加入第二个参数$level(后来,看了老师的做法,没想到竟然与之相同,只是我最后也没能做出效果出来)

而别一个y友用了<ul><li>标签,解决目录层次问题!

附上其代码:

function tree($directory) {
    $mydir=dir($directory);
        echo "<ul>";
        while($file=$mydir->read()){
            if((is_dir("$directory/$file")) AND ($file!=".") AND ($file!="..")){
                echo "<li><font color='#ff00cc'><b>$file</b></font></li>";
                tree("$directory/$file");
            }else{
                echo "<li>$file</li>";
            }
        }
    echo "</ul>";
    $mydir->close();
    }
    //start the program
    echo "<h2>目录为粉红色</h2>";
tree('./');


总结:

程序的逻辑上我已经完成了!只是在显示结果这一块做的不够好!

在逻辑上,与老师的有很大的不同!

老师的是先为.及..判断及跳过,再执行文件显示操作,最后判断是否为目录!

而我的则是,先判断是否为目录,是目录了再判断是否不为.及..(想了想,我这样的判断!结构不够明了,逻辑上也不容易理解,在执行时,程序也不够健壮、优化!比Y友的还差一些!至少,人家是一步判断完毕!)

 /*

//所以,以后,在程序逻辑判断上,要先做排除!按以下逻辑顺序来处理:

1、某状态下无需要操作的先做判断,》语句

2、当前要操作的,》语句

3、某状态下需要做的操作,》语句

*/

显然,自己还是有很多的欠缺,以后,要多看别人的程序!多去了解别人的做法,解法!

 不然,又会像今天这样写一大堆无用的代码!浪费时间!

posted @ 2012-11-21 23:12  505430170  阅读(219)  评论(0编辑  收藏  举报