一个困扰偶很久的目录遍历问题

avenger 2003-01-12 04:45:10
前几天在做一个项目时用到了一个目录遍历问题。

看似简单,却花了偶近一天时间才搞定。

以下是我刚开始写的代码。大家能看出来是哪错了吗?:D

或者有兴趣的朋友也可以试试自己写写看。。



<?php
function Get($path,&$a) {
$handle = opendir($path);
while ($filename = readdir($handle)) {
if ($filename == "." || $filename == "..") continue;
if (is_dir($path."/".$filename)) {
$newpath = $path."/".$filename;
echo "<BR><BR><H2>目录".$filename."</H1><BR><BR>";
$a['d']++;
Get($newpath,&$a);
} else {
echo "<Normal>".$filename."</Normal>";
$a['f']++;
}

}
closedir($handle);
}

Get('c:/tmp',$count);
echo "共有目录{$count['d']}个,文件{$count['f']}个..."
?>

...全文
13 点赞 收藏 18
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
uGain 2003-01-25
呵呵,是啊,当时没有考虑目录名为“0”的情况。
好象在linux下,0是无效目录名吧。
回复
MeE 2003-01-25
错的 嬉戏
回复
MeE 2003-01-25
while ($filename = readdir($handle))
=>while ($filename = readdir(strval($handle)))
回复
LeeMaRS 2003-01-25
uGain, 你的程序不是"0"的问题, 一般的目录都删除不掉......
回复
LeeMaRS 2003-01-24
uGain, 我查了手册了, sorry, <>和!=是一样的, 我没注意:)
不过你的程序的确是不行:P
回复
xuzuning 2003-01-24

while ($filename = readdir($handle))
改为
while (($filename = readdir($handle))!="")
回复
uGain 2003-01-24
楼上的,做个简单的测试吧。
<?
if(1<>2) echo "hahahahaha";
?>
回复
LeeMaRS 2003-01-24
遇到目录名为0的会删不掉: 这是因为类似于while($File = readdir($Handle))的判断, 会把"0"转成0, 结果为假. uGain的和我的就不会.

但是uGain的程序不能正确删除子目录, 因为if(is_dir($file) && $file<>"." && $file<>"..")这个判断有问题, PHP中好像没有<>...是!=才对吧. 不知道为什么PHP竟然不报错. 呵呵~
回复
LeeMaRS 2003-01-24
我写的一个删除程序, 没发现有什么遇目录名为0删不掉的问题.

function delfile($path)
{
echo "<dl>";
echo "<dt>删除目录 <font color=green>".$path." </font>……<br>";

$handle=@opendir($path);
@chdir($path);

while (($file=@readdir($handle))!="")
{
if (($file==".") OR ($file=="..")) continue;

if (is_dir($file))
delfile($file);
else
{
echo "<dd>删除文件 <font color=green>".$file."</font> …… ";
if (@unlink($file))
echo "<font color=blue>成功!</font><br>";
else
echo "<font color=red>失败!</font><br>";
}
}

@closedir($handle);

@chdir("..");

echo "<dt>删除目录 <font color=green>".$path."</font> …… ";
if (@rmdir($path))
echo "<font color=blue>成功!</font><br>";
else
echo "<font color=red>失败!</font><br>";

echo "</dl>";
}
?>
回复
avenger 2003-01-24
倒。不会这点小问题就难倒大家了吧。还是高手都不屑回答。呵

回复
up,这个问题怎么解决,目录名为0.
先给他改个名字,再删除.
好像有点可笑.
回复
up,这个问题怎么解决,目录名为0.
先给他改个名字,再删除.
好像有点可笑.
回复
avenger 2003-01-16
呵。上面那么多代码都不好用。如果碰到一个目录名为0的目录。全废~~

:P
回复
xizi2002 2003-01-13
网上有很多这样的代码呵,
我也不知是谁写的了
<?
$FileCount = 0; //文件个数
$DirectoryCount = 0; //目录个数
function FCount($Path)
{
global $FileCount,$DirectoryCount;
$Handle = opendir($Path);
while($File = readdir($Handle))
{
if(filetype($Path.$File) != 'dir')
{
echo "----文件名----$File<br>";
$FileCount++;
}
if($File !='.' && $File !='..' && filetype($Path.$File)=='dir')
{
echo "目录名----$File<br>";
$DirectoryCount++;
FCount($Path."$File/");
}
}
closedir($Handle);
}FCount('./hyforum_code/');
echo "<br>请您注意脚本程序30秒钟超时警告<br><br>目录个数……………………$DirectoryCount<br>----文件个数……………………$FileCount<br>";
?>
回复
hhzh426 2003-01-13
while ($filename = readdir($handle))
=>while (($filename = readdir($handle) !==false)
Get($newpath,&$a);
=>Get($newpath,$a);
既然是在windows环境中,就将/变为\好了。
回复
uGain 2003-01-13
<?
function deltree($dir){
chdir($dir);
$handle=opendir('.');
while (($file=readdir($handle))<>"") {
if(is_file($file))
unlink($file);
if(is_dir($file) && $file<>"." && $file<>"..")
deltree($file);
}
closedir($handle);
}
deltree('test');
?>
回复
uGain 2003-01-13
这是以前做的一个类似dos下的deltree命令的函数,用的就是递归。可以参考一下。
回复
LeeMaRS 2003-01-12
目录遍历不是一个很难的问题啊, 递归判断就可以了.
回复
发帖
基础编程
创建于2007-09-28

2.1w+

社区成员

从PHP安装配置,PHP入门,PHP基础到PHP应用
申请成为版主
帖子事件
创建了帖子
2003-01-12 04:45
社区公告
暂无公告