читать файлы в папке - PullRequest
       0

читать файлы в папке

3 голосов
/ 25 августа 2010

В моем приложении есть папка с именем видео. я хочу просмотреть все файлы только из этой папки, я сделал почти, он не показывает ни одной папки в папке видео, кроме .DS_Store В настоящее время я применил условие if, чтобы скрыть это, но я хочу, чтобы идеальное решение могло помочь любому: - мой код: ----

$dir = "../videos/";
$dh  = opendir($dir);

print '<select size="4" name="vidfile">';

while (($file = readdir($dh)) !== false) {

    if (is_file($dir.'/'.$file) && $file != "." && $file != "..") {

        if ($file!=".DS_Store") {

            print "<option>{$file}</option>";
        }
    }          
}

print '</select>'; 

closedir($dh);

Ответы [ 4 ]

13 голосов
/ 25 августа 2010

Быстрое и простое решение

Вы можете упростить свою жизнь и использовать DirectoryIterator для просмотра каталога.

echo '<select name="vids" size="4">';
foreach( new DirectoryIterator('/path/to/videos') as $file) {
    if( $file->isFile() === TRUE && $file->getBasename() !== '.DS_Store') {
        printf("<option>%s</option>\n", htmlentities($file->getBasename()));
    }
}
echo '</select>';

Улучшение: Отсоединение фильтрации каталогов от здания SelectBox

Если вы хотите отделить логику фильтрации от цикла foreach, вы можете создать подкласс FilterIterator для капсулыэта логика в это accept() метод.DirectoryIterator должен быть включен в FilterIterator тогда.Главное - это возможность многократного использования:

class MyFilter extends FilterIterator
{
    public function accept()
    {
        return $this->current()->isFile() === TRUE &&
               $this->current()->getBasename() !== '.DS_Store';
    }
}

$iterator = new MyFilter(new DirectoryIterator('/path/to/videos'));

Когда вы используете foreach на отфильтрованном итераторе, он автоматически запускает accept().Если accept() возвращает FALSE, текущий элемент будет отфильтрован в итерации.

Вы создаете SelectBox следующим образом:

echo '<select name="vids" size="4">';
foreach( $iterator as $file) {
    printf("<option>%s</option>\n", htmlentities($file->getBasename()));
}
echo '</select>';

Альтернатива созданию подкласса FilterIterator

Если вам лень писатьотделите FilterIterator или подумайте, что это просто не стоит того или иного случая, или где-то уже есть валидаторы, и вы не хотите дублировать их код, но все же хотите отделить создание Filtering и SelectBox, вы также можете использовать этот пользовательский FilterChainIterator и добавьте к нему обратные вызовы:

$iterator = new FilterChainIterator(new DirectoryIterator('/path/to/videos'));
$iterator->addCallback(function($file) {
    return $file->isFile() === TRUE &&
           $file->getBasename() !== '.DS_Store';}); 

Создание SelectBox будет таким же, как показано выше.


Улучшение: повторное использование создания SelectBox

Кроме того, если вы хотите сделать создание SelectBox повторно используемым, почему бы не создать помощник для него.Ниже приведен очень простой пример, который использует DOM для создания фактического HTML.Вы передаете любой итератор, и он создает HTML для вас, когда вы вызываете его метод render() или используете его в строковом контексте:

class SelectBox
{
    protected $iterator;
    public function __construct(Iterator $iterator)
    {
        $this->iterator = $iterator;
    }
    public function render()
    {
        $dom = new DOMDocument;
        $dom->formatOutput = TRUE;
        $dom->loadXml('<select name="vids"/>');
        $dom->documentElement->appendChild(new DOMElement('option', 'Pick One'));
        foreach($this->iterator as $option) {
            $dom->documentElement->appendChild(
                new DOMElement('option', $option));
        }
        return $dom->saveXml($dom->documentElement);
    }
    public function __toString()
    {
        return $this->render();
    }
}

И затем печать SelectBox из итератора так же проста, как

echo new SelectBox(new MyFilter(new DirectoryIterator('/path/to/videos')));

Это довольно гибко, учитывая, что для всего есть Итераторы.Например,

echo new SelectBox(new ArrayIterator(array('foo', 'bar', 'baz')));

даст аккуратно отформатированный

<select>
  <option>Pick One</option>
  <option>foo</option>
  <option>bar</option>
  <option>baz</option>
</select>
2 голосов
/ 25 августа 2010
<?php
$dir = '../videos/';
if($dh = opendir($dir)){
   echo '<select size="4" name="vidfile">';
   while(($file=readdir($dh)) !== FALSE){
      $file = $dir . '/' . $file;
      if(!is_file($file) || substr($file, 0, 1) == '.'){
         continue;
      }
      printf('<option>%s</option>', htmlentities($file));
   }
   echo '</select>';
   closedir($dh);
}
?>

Во-первых, если opendir не работает, не продолжайте с мусором.Он игнорирует не файлы (каталоги) и файлы, начинающиеся с точки (включая., .., .htaccess и т. Д.)

1 голос
/ 25 августа 2010

Вот вариант, который работает вместо glob(), имеет массив исключенных файлов, собирает все элементы option и затем выводит их как один. Кроме того, glob() позволяет фильтровать определенные расширения файлов с помощью синтаксиса скобок, как показано в строке с комментариями.

$dir = "../videos";
$mask = "*";
// $mask = "*.{wmv,mpeg,mpg}";  // get only files of these types

$files = glob($dir."/".$mask);
$excluded_files = array(".DS_store");
$html = null;    

if (count($files) > 0)
foreach ($files as $file)
 {
  $filename = basename($file);
  if (in_array($filename, $excluded_files)) continue;
  $html.="<option>".htmlentities($filename)."</option>";
 }

 echo $html;
0 голосов
/ 25 августа 2010

Просто if ($file[0] == ".") continue; вместо этих 2, если это, вероятно, то, что вы ищете.
Хотя я бы сделал это немного иначе, в двух частях.
получение части данных:

<?php
  $dir = "../videos/";
  $dh = opendir($dir);
  $filesarr = array();
  while (($file = readdir($dh)) !== false) {
    if ($file[0] != ".") $filesarr[] = $file;
  }
  closedir($dh);
?>

и отображать часть данных:

<select size="4" name="vidfile">
<?php foreach ($filesarr as $file): ?>
<option><?php echo $file ?></option>
<?php endforeach ?>
</select>

мне кажется, что он более чистый

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...