我有一个文件夹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');
答案 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";
}
}