递归及文件、目录操作记录
应作业要求,写了一个递归文件夹
列出某文件夹下的所有文件及子文件
文件夹结构如下:
《》代表文件夹
<>代表文件
文件夹:
《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,' ';
}
//此为老师的写法
if($filename=='.' || $filename=='..'){
continue;
}
echo str_repeat(' ',$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、某状态下需要做的操作,》语句
*/
显然,自己还是有很多的欠缺,以后,要多看别人的程序!多去了解别人的做法,解法!
不然,又会像今天这样写一大堆无用的代码!浪费时间!