【问题标题】:PHP list all files in directory [duplicate]PHP列出目录中的所有文件[重复]
【发布时间】:2011-04-19 02:58:39
【问题描述】:

可能重复:
Get the hierarchy of a directory with PHP
Getting the names of all files in a directory with PHP

我见过列出目录中的所有文件的功能,但是我怎样才能列出子目录中的所有文件,所以它返回一个数组喜欢吗?

$files = files("foldername");

所以$files 类似于

array("file.jpg", "blah.word", "name.fileext")

【问题讨论】:

    标签: php arrays file directory


    【解决方案1】:
    foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator('.')) as $filename)
    {
        // filter out "." and ".."
        if ($filename->isDir()) continue;
    
        echo "$filename\n";
    }
    


    PHP 文档:

    【讨论】:

    • SPL 为 +1。 IMO 是时候(已经有一段时间了)开始使用 SPL 而不是这些巨大而缓慢的程序块了。
    • 完整代码(更改文件夹名称)-<?php$path = realpath('yourfolder/examplefolder');foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename){echo "$filename\n";}?>
    • 哦哇...与上面的庞然大物相比。太棒了。
    • 它包括... 特殊目录。希望您可以通过添加!$filename->isDir() 测试将它们过滤掉(没有isDot(),请参阅SplFileInfo)。
    • 另外,还有指向 PHP 文档的有用链接:RecursiveDirectoryIterator - RecursiveIteratorIterator
    【解决方案2】:

    所以您正在寻找递归目录列表?

    function directoryToArray($directory, $recursive) {
        $array_items = array();
        if ($handle = opendir($directory)) {
            while (false !== ($file = readdir($handle))) {
                if ($file != "." && $file != "..") {
                    if (is_dir($directory. "/" . $file)) {
                        if($recursive) {
                            $array_items = array_merge($array_items, directoryToArray($directory. "/" . $file, $recursive));
                        }
                        $file = $directory . "/" . $file;
                        $array_items[] = preg_replace("/\/\//si", "/", $file);
                    } else {
                        $file = $directory . "/" . $file;
                        $array_items[] = preg_replace("/\/\//si", "/", $file);
                    }
                }
            }
            closedir($handle);
        }
        return $array_items;
    }
    

    【讨论】:

    • 不要在递归中使用正则表达式,它们往往很慢!在您的情况下使用 rtrim 功能。
    • 我将其重写为一个要点,以提高效率并且只返回文件:gist.github.com/brucekirkpatrick/8528710
    【解决方案3】:

    我认为您正在寻找php's glob function。您可以致电glob(**) 获取递归文件列表。

    编辑:我意识到我的 glob 不能在所有系统上可靠地工作,所以我提交了这个更漂亮的已接受答案版本。

    function rglob($pattern='*', $flags = 0, $path='')
    {
        $paths=glob($path.'*', GLOB_MARK|GLOB_ONLYDIR|GLOB_NOSORT);
        $files=glob($path.$pattern, $flags);
        foreach ($paths as $path) { $files=array_merge($files,rglob($pattern, $flags, $path)); }
        return $files;
    }
    

    来自:http://www.phpfreaks.com/forums/index.php?topic=286156.0

    【讨论】:

      【解决方案4】:
      function files($path,&$files = array())
      {
          $dir = opendir($path."/.");
          while($item = readdir($dir))
              if(is_file($sub = $path."/".$item))
                  $files[] = $item;else
                  if($item != "." and $item != "..")
                      files($sub,$files); 
          return($files);
      }
      print_r(files($_SERVER['DOCUMENT_ROOT']));
      

      【讨论】:

        【解决方案5】:

        我需要实现对给定目录的读取,依靠Chuck Vose的功能,我创建了这个页面来读取依赖JQuery的目录:

        <?php
        
        /**
         * Recovers folder structure and files of a certain path
         * 
         * @param string $path Folder where files are located
         * @param string $pattern Filter by extension
         * @param string $flags Flags to be passed to the glob
         * @return array Folder structure
         */
        function getFolderTree($path)
        {
            //Recovers files and directories
            $paths = glob($path . "*", GLOB_MARK | GLOB_ONLYDIR | GLOB_NOSORT);
            $files = glob($path . "*");
        
            //Traverses the directories found
            foreach ($paths as $key => $path)
            {
                //Create directory if exists
                $directory = explode("\\", $path);
                unset($directory[count($directory) - 1]);
                $directories[end($directory)] = getFolderTree($path);
        
                //Verify if exists files
                foreach ($files as $file)
                {
                    if (strpos(substr($file, 2), ".") !== false)
                        $directories[] = substr($file, (strrpos($file, "\\") + 1));
                }
            }
        
            //Return the directories
            if (isset($directories))
            {
                return $directories;
            }
            //Returns the last level of folder
            else
            {
                $files2return = Array();
                foreach ($files as $key => $file)
                    $files2return[] = substr($file, (strrpos($file, "\\") + 1));
                return $files2return;
            }
        }
        
        /**
         * Creates the HTML for the tree
         * 
         * @param array $directory Array containing the folder structure
         * @return string HTML
         */
        function createTree($directory)
        {
            $html = "<ul>";
            foreach($directory as $keyDirectory => $eachDirectory)
            {
                if(is_array($eachDirectory))
                {
                    $html .= "<li class='closed'><span class='folder'>" . $keyDirectory . "</span>";
                    $html .= createTree($eachDirectory);
                    $html .=  "</li>";
                }
                else
                {
                    $html .= "<li><span class='file'>" . $eachDirectory . "</span></li>";
                }
            }
            $html .= "</ul>";
        
            return $html;
        }
        
        //Create output
        $directory = getFolderTree('..\videos');
        $htmlTree = createTree($directory["videos"]);
        ?>
        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml">
            <head>
                <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/>
                <title>PHP Directories</title>
        
                <link rel="stylesheet" href="http://jquery.bassistance.de/treeview/jquery.treeview.css" />
                <link rel="stylesheet" href="http://jquery.bassistance.de/treeview/demo/screen.css" />
        
                <script src="http://jquery.bassistance.de/treeview/lib/jquery.js" type="text/javascript"></script>
                <script src="http://jquery.bassistance.de/treeview/lib/jquery.cookie.js" type="text/javascript"></script>
                <script src="http://jquery.bassistance.de/treeview/jquery.treeview.js" type="text/javascript"></script>
        
                <script type="text/javascript" src="http://jquery.bassistance.de/treeview/demo/demo.js"></script>
        
            </head>
            <body>
                <div id="main">
                    <ul id="browser" class="filetree">
                        <?php echo $htmlTree;?>
                    </ul>
                </div>
            </body>
        </html>
        

        用JQuery的树中使用的结构,取的站点是: http://jquery.bassistance.de/treeview/demo/

        希望有用!

        【讨论】:

          猜你喜欢
          • 2018-06-08
          • 2013-03-24
          • 2017-05-01
          • 2013-10-30
          • 2013-07-12
          • 2016-07-05
          相关资源
          最近更新 更多