Opendir在子文件夹中的文件之前获取文件数组

时间:2012-07-26 19:04:46

标签: php opendir

我有一个函数可以递归返回文件夹中的文件数组。

protected function getFiles($base) {

    $files = array();       
    if(!is_dir($base)) return $files;

    if (($handle = opendir($base)) != false) {
        while (false !== ($file = readdir($handle))) {
            if ($file == "." || $file == "..") continue;

            if(is_dir("$base/$file")) {                 
                $subfiles = $this->getFiles("$base/$file");
                $files = array_merge($files, $subfiles);                    
            } else {                    
                if(File::type($file,false) == "xml") 
                    $files[] = "$base/$file";
            }
        }
        closedir($handle);
    }

    return $files;
}

如何修改它以便它始终在任何子文件夹之前首先列出根文件?目前默认情况下,文件夹始终排在第一位。

3 个答案:

答案 0 :(得分:1)

您可能需要查看PHP SPL DirectoryIterator类。您可以实例化该对象,然后快速迭代以分割出目录与文件与链接,并为每个链接获取完整的SplFileInfo对象(这使得获取您想要的文件信息变得非常容易)。

$directory = '/path/to/directory';
$iterator = new DirectoryIterator($directory);
$dirs = array();
$files = array();
$links = array();

foreach($iterator as $obj) {
    if($obj->isFile()) {
        $files[] = $obj;
    } else if ($obj->isDir()) {
        $dirs[] = $obj;
    } else if ($obj->isLink()) {
        $links[] = $obj;
    }
}

很抱歉刚才意识到你想要递归地做到这一点。那么使用RecursiveDirectoryIterator,但概念大致相同。

答案 1 :(得分:0)

在循环目录指针时创建一个子目录数组,并在最后迭代目录数组:

protected function getFiles($base) {

    $files = $dirs = array();       
    if(!is_dir($base)) return $files;

    if (($handle = opendir($base)) != false) {

        while (false !== ($file = readdir($handle))) {
            if ($file == "." || $file == "..") continue;

            if(is_dir("$base/$file")) {    
                $dirs[] = "$base/$file";
            } else {                    
                if(File::type($file,false) == "xml") 
                    $files[] = "$base/$file";
            }
        }
        closedir($handle);

        foreach ($dirs as $dir) {
            $subfiles = $this->getFiles($dir);
            $files = array_merge($files, $subfiles);                    
        }

    }

    return $files;
}

答案 2 :(得分:0)

使用两个数组一个用于当前文件夹中的文件,一个用于子文件夹中的文件然后合并它们。

protected function getFiles($base) {

    $files = array();       
    $subFiles = array();        
    if(!is_dir($base)) return $files;

    if (($handle = opendir($base)) != false) {
        while (false !== ($file = readdir($handle))) {
            if ($file == "." || $file == "..") continue;

            if(is_dir("$base/$file")) {                 
                $subFiles = array_merge($subFiles, $this->getFiles("$base/$file"));                 
            } else {                    
                if(File::type($file,false) == "xml") 
                    $files[] = "$base/$file";
            }
        }
        closedir($handle);
    }

    return array_merge($files, $subFiles);
}