递归遍历路径 貌似进入了死循环

MichaelBin 发布于 2015/07/10 19:59
阅读 1K+
收藏 0

【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”

<?php
    $dirname = ".";

    function fordir($dirname){
        $dir = opendir($dirname);

        
        //第一次读. 第二次读..
        //readdir($dir);
        //readdir($dir);

        while(($file = readdir($dir)) !== false ){
            if($file == "." || $file == ".."){
                continue;
            }
            $file = $dirname.'/'.$file;
            
            if(is_dir($file)){
                echo "目录: {$file}<br>";
                fordir($file);
            }else{
                echo "文件: {$file}<br>";
            }
        }

        closedir($dir);
    }
    

    fordir($dirname);

貌似进入了死循环,到底哪里出现了问题呢?

我猜想死循环是和.和.. 有关系的,但是……

求助!!!


加载中
0
开源小姐
开源小姐

用这个吧

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('./',FilesystemIterator::SKIP_DOTS));
foreach($iterator as $file){
    echo $file.'<br />';
}

你写的$dirname在递归的时候没有加上子目录。

开源小姐
开源小姐
回复 @小姐_开源不 : 如果是学习的话,你在递归的时候应该把$dirname.'/'.$file传过去,而不是传$file再加上$dirname在前面
开源小姐
开源小姐
回复 @MichaelBin : 这是PHP标准库。随便可以用。只要不是PHP5以前的
MichaelBin
MichaelBin
回复 @MichaelBin : 你给我的貌似是个类啊,专门封装好的遍历的类吗?如果是,那我还有必要在我这个代码上纠结吗?继续往下学?
MichaelBin
MichaelBin
呃,大哥我刚学啊,你给我整了这么复杂的函数,我是看得高胖的视频,按照它整的,还有我的readdir()读的第一次和第二次为什么不是. 和.. 呢?
0
开源小姐
开源小姐

没有关系,是你目录太多层了吧

递归只到100

MichaelBin
MichaelBin
回复 @小姐_开源不 : 是不是和系统有关我的是ubuntu,每次都是卡死机,并且,我根据代码走了一遍,虽然$file不包含上级,但是我的$dirname 一直有上级的目录啊,然后字符串一连接,应该没有问题啊
开源小姐
开源小姐
回复 @小姐_开源不 : 另外,我测试你的代码没有出现死循环
开源小姐
开源小姐
貌似你路径传递不对吧,$file不包含上级目录,你放到$dirname后面,不是永远进不了第三层了 ? 假设第三层目录和第二层一样,那不就死循环了?
MichaelBin
MichaelBin
一点也不多啊
0
开源小姐
开源小姐

这个吧那就:
recurse('../');
function recurse($path){
    $dir = opendir($path);
    while($item = readdir($dir)){
        if('.' == $item || '..' == $item) continue;
        if(is_dir($path.'/'.$item)){
            recurse($path.'/'.$item);
        }else{
            echo $item.'<br />';
        }
    }
}

MichaelBin
MichaelBin
回复 @小姐_开源不 : 卧槽,我知道了大哥,哈哈哈,貌似是路径权限的问题,chmod -R 777 全部解决,哈哈哈, 爽坏了,么的,浪费了快两天时间, 可特么整明白了!!!
MichaelBin
MichaelBin
回复 @小姐_开源不 : 你函数为什么调用在声明定义前面?搞不明白不想睡啊
开源小姐
开源小姐
回复 @MichaelBin : 照我这样写没问题吧? 有问题明天了。不睡觉啊
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部