繁体   English   中英

如何在php中列出包含大量文件的目录?

[英]How to list a directory with a large number of files in php?

我知道有一天会发生...所以我有一个php例程来列出目录中的文件,获取属性和子目录,并返回带有漂亮json字符串和所有信息的http调用。 在我的本地主机中,我使用它来递归列出目录和子目录中的所有文件,因此我将拥有字节总数,等等。这是实际列出文件的代码的一部分:

        (...)
        $this->Lista = array();
        $this->SubDirs = array();
        $ldPont  = opendir($dir);
        if(!$ldPont){
            $this->erro = 'perms';
            return FALSE;
        } else {
            $this->tamanho = 0;
            $this->tamanhoTotal = 0;
            while(FALSE !== ($ldNome = readdir($ldPont))) {
                if(substr($ldNome, 0, 1)!="." && substr($ldNome, 0, 2)!=".."){
                    //echo('<p>'.$ldNome.'</p>');
                    if(is_dir($dir.'/'.$ldNome)){
                        $this->SubDirs[] = $this->elementoDoArquivo($dir.'/'.$ldNome);
                    } else {
                        $path = $dir.'/'.$ldNome;
                        $this->tamanhoTotal += filesize($path);
                        $ldBase = pathinfo($path, PATHINFO_FILENAME);
                        $ldExt = pathinfo($path, PATHINFO_EXTENSION);
                        $ldExt = strtolower($ldExt);
                        if(is_array($Exts) && count($Exts)>0){
                            $ldTeste = in_array($ldExt, $Exts);
                        } else {
                            $ldTeste = TRUE;
                        }
                        if($ldTeste) {
                            $Arq = $this->elementoDoArquivo($path);
                            if($Arq["Metadados"]) $this->comMetadados = TRUE;
                            $this->Props[$Arq["Prop"]["name"]] = $Arq["Prop"];
                            $this->tamanho += $Arq["bytes"];
                            $this->Lista[] = $Arq;
                        }
                    }
                }
            }
            // Saída de uma leitura ok
            closedir($ldPont);
            uasort($this->Lista, $sort_func[$ord]); //$sort_func[$this->ordem]);
            if($ord_r) $this->Lista = array_reverse($this->Lista);
            $this->Lista = array_values($this->Lista);
            return $this->Lista;
        }

这是一堂课。 列出目录将执行许多任务,最终它将在具有大量文件的远程服务器中超时,具体取决于服务器的可用性(它是共享主机)。 我想我需要以不同的方式处理此问题,不知道如何。 有什么建议么?

编辑:我通过使用glob的更简单的代码来解决该问题,并且不必查找每个文件的太多详细信息。 经过几次试验,我可以获得所需的结果。 但是问题仍然存在。代码是一个更大的库的一部分,这是我使用的部分:

    case "list":
        if(!$usrRead){
            $Res->erro = "perms";
            $Res->msg = "Usuário sem permissões para esse diretório.";
            $Res->descr = $UsrPerms;
            break;
        }
        $Arqs = array();
        $Dirs = array();
        if(!is_dir($dirTeste)){
            $Res->erro = "diretório";
            $Res->msg = "O diretório não existe.";
        } else {
            $Args = explode(",",$nome);
            foreach($Args as $arg){
                if($arg=="") $arg = "*.*";
                $List = glob($dir.$arg);
                foreach($List as $path){
                    if(is_file($path)) {
                        $Arq = array(
                            "nome"=>basename($path), 
                            "datac"=>filectime($path), 
                            "datam"=>filemtime($path), 
                            "bytes"=>filesize($path));
                        if($MetaCampos){
                            $path_meta = nomearqMeta($path);
                            if($path_meta) {
                                $Meta = json_decode(file_get_contents($path_meta));
                                if($Meta) {
                                    foreach($MetaCampos as $campo){
                                        $Arq[$campo] = $Meta->$campo;
                                    }
                                }
                            }
                        }
                        $Arqs[] = $Arq;
                    }
                    //if(is_dir($path)) $Dirs[] = $path;
                }
            }
            if(count($Args)==1) {
                $Dirs = glob($dir."*", GLOB_ONLYDIR);
                $Dirs = array_map(function($d) { return $d."/"; }, $Dirs);
            }
            $Res->arqs = $Arqs;
            $Res->subdirs = $Dirs;
            $Res->erro = "OK";
            $Res->msg = "";
        }
        $Res->descr = "op:list,dir:".$dir.",nome:".$nome.",metaCampos:".$metaCampos;
        break;

如果您在Linux上运行,我建议通过PHP的shell_exec(或exec)执行递归目录列表,并将结果输出到文本文件中(请参见下面的代码示例)。 然后,仅使用PHP的file_get_contents()

<?php

$execListFile = shell_exec('ls -R /your/dir/path/here > mylistofFiles.txt');

$myFiles = file_get_contents('mylistofFiles.txt');

PS:此代码未经测试,但您明白了。

参考PHP.net shell_exec Linux ls命令

PS:窗口的ls -R等效于dir / s

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM