递归获取目录中的所有文件,并按扩展名获取子目录



我在看RecursiveDirectoryIteratorglob

">根据扩展名(例如).less 向我返回文件列表(在数组中)。哦,看看所有的子项,孙子等等,不包括...,直到你找到所有文件匹配。

但我不确定创建递归函数的最佳方法,该函数远远超出了孙子。

我所拥有的是一团糟,它工作了两年 - 但现在我需要重构并更改它:

public function get_directory_of_files($path, $filename, $extension) {
if (!is_dir($path)) {
throw new AisisCore_FileHandling_FileException("Could not find said path: " . $path);
}
if (file_exists($filename)) {
$handler = opendir($path);
while ($file = readdir($handler)) {
if ($file != "." && $file != "..") {
$this->package_files [] = $file;
$count = count($this->package_files);
for ($i = 0; $i < $count; $i++) {
if (substr(strrchr($this->package_files [$i], '.'), 1) == $extension) {
if ($this->package_files [$i] == $filename) {
$this->files_got_back = $this->package_files [$i];
}
}
}
}
}
}
return $this->_files_got_back;
}

这需要传入文件名,这不再是我真正要做的事情。那么如何重写这个函数来做上面的">伪代码"

此函数递归查找具有匹配结束字符串的文件

function getDirectoryContents($directory, $extension)
{
$extension = strtolower($extension);
$files = array();
$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory));
while($it->valid()) 
{
if (!$it->isDot() && endsWith(strtolower($it->key()), $extension))
{
array_push($files, $it->key());
}
$it->next();
}
return $files;
}
function endsWith($haystack, $needle)
{
return $needle === "" || substr($haystack, -strlen($needle)) === $needle;
}

这样用 print_r(getDirectoryContent('folder/', '.php'));

它将扩展名转换为小写以进行比较

看看这段代码:

<?php
class ex{
private function get_files_array($path,$ext, &$results){ //&to ensure it's a reference... but in php obj are passed by ref.
if (!is_dir($path)) {
//throw new AisisCore_FileHandling_FileException("Could not find said path: " . $path);
}
if ($dir = opendir($path)) {
$extLength = strlen($ext);
while (false !== ($file = readdir($dir))) {
if ($file != '.' && $file != '..'){
if (is_file($path.'/'.$file) && substr($file,-$extLength) == $ext){
$results[] = $path . '/' . $file; //it's a file and the correct extension
}
elseif (is_dir($path . '/'. $file)){ 
$this->get_files_array($path.'/'.$file, $ext, $results); //it's a dir
}               
}
}
}else{
//unable to open dir
}
}
public function get_files_deep($path,$ext){
$results = array();
$this->get_files_array($path,$ext,$results);
return $results;
}
}
$ex = new ex();
var_dump($ex->get_files_deep('_some_path','.less'));
?>

它将检索路径及其子目录中具有匹配扩展名的所有文件。

我希望这是你需要的。

最新更新