PHP:使用scandir

时间:2017-03-03 15:28:39

标签: php arrays

我有一个文件夹store_files,我有多个子文件夹。现在我可以获取所有文件夹和所有文件。现在我想获取所有文件夹,除了zip文件之外别无其他。我尝试添加条件,如果文件扩展名等于zip但似乎不起作用。如果我添加$ ext ==' zip'输出中没有任何显示。是否有另一种获取特定文件的方法,例如在图像中glob($getDirectory. '*.zip')

                function listFolderFiles($dir){
                    $ffs = scandir($dir);
                    echo '<ol>';
                    foreach($ffs as $ff){
                        $ext = pathinfo($ff, PATHINFO_EXTENSION);

                        if($ff != '.' && $ff != '..' && $ext == 'zip'){
                            echo '<li>';
                            $str = preg_replace('/\D/', '', $ff);
                            $str = substr($str, 0,-1);

                            $getYear = substr($str, 0,4);
                            $getMonth = substr($str, -4,2);
                            $getDay = substr($str, -2,2);
                            $theDate = $getYear.'-'.$getMonth.'-'.$getDay;
                            $theRealDate = date('Y M j', strtotime($theDate));
                            echo $theRealDate;


                            if(is_dir($dir.'/'.$ff)){
                             listFolderFiles($dir.'/'.$ff);
                            }

                            echo '</li>';
                        }

                    }
                    echo '</ol>';
                }
                listFolderFiles('store_files');

2 个答案:

答案 0 :(得分:2)

我认为您的问题源于scandir()不是(本身)递归目录搜索这一事实,它只直接在指定目录中列出文件和目录。如果您检测到listFolderFiles()是目录,则已经考虑了对$ff函数的递归调用。但是,您的问题是您已经过滤了之前的if语句中的目录(假设您的目录不会以&#39; .zip&#39;结尾)。我认为以下功能就是你所追求的:

            function listFolderFiles($dir){
                $ffs = scandir($dir);
                echo '<ol>';
                foreach($ffs as $ff){
                    $ext = pathinfo($ff, PATHINFO_EXTENSION);

                    if($ff != '.' && $ff != '..' && (is_dir($dir.'/'.$ff) || $ext == 'zip')){
                        echo '<li>';
                        $str = preg_replace('/\D/', '', $ff);
                        $str = substr($str, 0,-1);

                        $getYear = substr($str, 0,4);
                        $getMonth = substr($str, -4,2);
                        $getDay = substr($str, -2,2);
                        $theDate = $getYear.'-'.$getMonth.'-'.$getDay;
                        $theRealDate = date('Y M j', strtotime($theDate));
                        echo $theRealDate;


                        if(is_dir($dir.'/'.$ff)){
                         listFolderFiles($dir.'/'.$ff);
                        }

                        echo '</li>';
                    }

                }
                echo '</ol>';
            }
            listFolderFiles('store_files');

答案 1 :(得分:1)

我不认为使用glob适合此背景:

$ffs = glob($dir . "/*/*.zip");

只会从子目录而不是父目录中获取zip文件。

您可能需要使用RecursiveDirectoryIterator,这样会更合适

$files = new RecursiveDirectoryIterator("./");
$iterator = new RecursiveIteratorIterator($files, RecursiveIteratorIterator::SELF_FIRST);

foreach ($iterator as $file) {
    if (false === strpos($file, '/.') && strpos($file, '.zip')) {
        echo $file, "\n";
    }
}

感谢this comment submitter