Чтение каталога и распечатка файлов, которые он содержит - PullRequest
0 голосов
/ 10 апреля 2011

Мне нужно написать класс на PHP.Ввод принимает путь (имя каталога).Класс имеет два метода:

  1. files - возвращает массив имен файлов этого каталога.
  2. table - возвращает сгенерированную таблицу html со списком файлов в этом каталоге.

Как мне это сделать?

Ответы [ 3 ]

3 голосов
/ 10 апреля 2011

Вы не должны создать класс для этого.На самом деле, вы не должны .Это слишком сложно и совершенно не нужно.

Если вам нужно прочитать список файлов в каталоге, у вас есть три варианта: readdir, glob или DirectoryIterator .

Если вам нужно прочитать список файлов в каталоге и все каталоги внутри него, то вы хотите использовать RecursiveDirectoryIterator .

Тамявляются адекватными примерами использования на связанных страницах документации.

Используя их, вы можете получить свои list'o'files и построить свой HTML.

0 голосов
/ 10 апреля 2011

Я думаю, что было бы хорошо создать класс для такого функционала, потому что вы можете намного лучше прогнозировать его поведение и обходить тонкие изменения в 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>
<?
    }
}
0 голосов
/ 10 апреля 2011

Очень простой пример класса.

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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...