3
回答
递归遍历路径 貌似进入了死循环
终于搞明白,存储TCO原来是这样算的>>>   
<?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);

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

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

求助!!!


举报
MichaelBin
发帖于2年前 3回/594阅
共有3个答案 最后回答: 2年前

用这个吧

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

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

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

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

递归只到100

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

这个吧那就:
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 />';
        }
    }
}

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