读取目录并列出它包含的文件

时间:2011-04-10 07:07:09

标签: php directory

我需要用PHP编写类。输入采用路径(目录名称)。该课程有两种方法:

  1. files - 返回此目录的文件名数组。
  2. table - 返回生成的html表,其中包含此目录中的文件列表。
  3. 我该怎么做?

3 个答案:

答案 0 :(得分:3)

需要为此创建一个类。实际上,你不应该。这太复杂了,完全没必要。

如果您需要阅读目录中的文件列表,则有三个选项:readdirglobDirectoryIterator

如果您需要阅读目录中的文件列表及其中的所有目录,那么您要使用RecursiveDirectoryIterator

链接文档页面上有足够的用法示例。

使用这些,你可以获得你的list'o'files并构建你的HTML。

答案 1 :(得分:0)

非常简单的课程示例。

class MyFiles {

    public static function files($path) {
        // Logic used to get the files found at path and return an array
        // Just use the built-in functionality of PHP
        $filesArray = array();

        if (!is_dir($path)) {
            return $filesArray;
        }

        $dir  = opendir($path);
        while (false !== ($filename = readdir($dir))) {
            if (!is_dir($filename)) {
                $filesArray[] = $filename;
            }
        }

        return $filesArray;
    }

    public static function table($path) {
        $files = self::files($path);
        $c_files = count($files);

        if ($c_files == 0) {
            return "<table><tbody><tr><td>No files at $path</td></tr></tbody></table>";
        }

        $table = "";
        for ($i = 0; $i < $c_files; $i++) {
            $table .= "<tr><td>{$files[$i]}</td></tr>";
        }

        return "<table><tbody>$table</tbody></table>";
    }

}

$fileTable = MyFiles::table('/my/path/with/files');

答案 2 :(得分:0)

我认为为这样的functionaliteit创建一个类很好,因为你可以更好地预测它的行为,并在不同版本的PHP中进行微妙的变化。此外,您可以创建不同的类来读取其他位置(如数据库或csv文件)的文件列表。

在这种情况下,我从基类扩展了一个渲染器类,因为我认为渲染不应该是基类的一部分。实际上,为此创建一个单独的类可能更好,它使用Folder的任何后代来呈现它。但我会留给你找出最适合你的。

<?
class Folder
{
    private $folder = '';
    public function getFolder()
    {
        return $this->folder;
    }
    protected function setFolder($value)
    {
        $this->folder = (string)$folder;
    }

    public __construct($folder)
    {
        this->setFolder($folder);
    }

    public function readFileNames()
    {
        $folder = (string)$this->getFolder();
        if ($folder === '')
        {
            throw new exception("Folder name is empty");
        }
        if (is_dir($folder) !== true)
        {
            throw new exception("'$folder' is not a directory.");
        }
        $dir = @opendir($this->folder);
        if ($dir === false)
        {
            throw new exception("Cannot open directory '$folder'.");
        }
        $result = array();
        while (false !== ($fileName = readdir($dir)))
        {
            if (is_file($fileName) === true)
            {
                $result[] = $fileName;
            }
        }
        return $result;
    }

    public function readFiles()
    {
        $fileNames = $this->readFileNames();
        $fileNames = array_flip($fileNames);
        foreach($fileNames as $fileName=>&$fileContents)
        {
            if (false === ($file = @readFile($fileName)))
            {
                $fileContents = null;
            }
            else
            {
                $fileContents = $file;
            }
        }
    }
}

class FolderTableRenderer extends Folder
{
    public function renderTable()
    {
?>
    <table>
        <thead><tr><th>File name</th></tr></thead>
        <tbody>
<?
        foreach ($this->readFileNames() as $fileName)
        {
?>
            <tr><td><?=$fileName?></td></tr>
<?
        }
?>
        </tbody>
    </table>
<?
    }
}