【问题标题】:Output all mp4 files from multiple directories从多个目录输出所有 mp4 文件
【发布时间】:2014-04-28 15:00:07
【问题描述】:

我有问题。我想输出所有扩展名为 .mp4 的文件名。下面的代码可以做到,但它只从一个目录输出。

<?php
if ($handle = opendir('/media/AB12-34/DCIM/100DCIM')) {
    while (false !== ($file = readdir($handle)))
    {
if ($file != "." && $file != ".." && strtolower(substr($file, strrpos($file, '.') + 1)) == 'mp4')
        { 
$thelist .= '<p><td><option value="'.$file.'">'.$file. '</option></td>';
        }
    }
    closedir($handle);

我希望脚本从/media/AB*/DCIM/100DCIM(请注意星号)目录中的所有目录中输出所有 .mp4 文件。有没有办法使用opendir 命令来做到这一点?尝试使用 * 但它不起作用。

【问题讨论】:

标签: php directory filenames opendir


【解决方案1】:

使用 PHP5 的内置 RecursiveDirectoryIterator 类似:

<?php
/**
 * RecursiveDirectoryIterator function to get media.
 *
 * @param string $base_dir
 * @param array $extentions
 * @return array
 */
function get_media($base_dir, $extentions = array('mp4')) {
    if(!file_exists($base_dir)) return array();

    $extensions = implode('|', $extentions);
    $directory  = new RecursiveDirectoryIterator($base_dir);
    $iterator   = new RecursiveIteratorIterator($directory);
    $regex      = new RegexIterator($iterator, "/^.+\.$extensions$/i", RecursiveRegexIterator::GET_MATCH);

    $ret        = array();
    foreach ($regex as $filename=>$object) {
        $ret[] = $filename;
    }
    return $ret;
}

//print_r( get_media('/media/', array('mp4')) );

$thelist = '<select size="1" name="?">';
foreach (get_media('/media/', array('mp4')) as $file)
{
    $thelist .= '<option value="'.$file.'">'.$file.'</option>';
}
$thelist .= '</select>';

echo $thelist;
?>

编辑(添加时间,见评论):

由于您基本上拥有文件的完整路径,您可以在迭代器函数中添加filectime($filename);,或者在执行显示循环时将其添加到外部,下面是在函数内部执行。

<?php
/**
 * RecursiveDirectoryIterator function to get media.
 *
 * @param string $base_dir
 * @param array $extentions
 * @return array
 */
function get_media($base_dir, $extentions = array('mp4')) {
    if(!file_exists($base_dir)) return array();

    $extensions = implode('|', $extentions);
    $directory  = new RecursiveDirectoryIterator($base_dir);
    $iterator   = new RecursiveIteratorIterator($directory);
    $regex      = new RegexIterator($iterator, "/^.+\.$extensions$/i", RecursiveRegexIterator::GET_MATCH);

    $ret        = array();
    $i = 0;
    foreach ($regex as $filename=>$object) {
        $ret[$i]['filename'] = $filename;
        $ret[$i]['filetime'] = filectime($filename);
        $i++;
    }
    return $ret;
}

//print_r( get_media('/media/', array('mp4')) );

$thelist = '<select size="1" name="?">';
foreach (get_media('/media/', array('mp4')) as $file)
{
    $thelist .= '<option value="'.$file['filename'].'">'.$file['filename'].' - '.date("F j, Y, g:i a",$file['filetime']).'</option>';
}
$thelist .= '</select>';

echo $thelist;
?>

【讨论】:

  • 非常感谢@Loz Cherone 先生。那工作得很好。也许你有另一个想法,如何打印出修改后的日期,而不是文件名?再次感谢您!
  • 不错!非常感谢。我找了将近 2 周的解决方案,你在 1 小时内就找到了!
  • @StartedFromTheBottom np,很高兴为您提供帮助。
  • 嘿@LozCheroneツ。如果可能的话,我想问你更多的事情。现在,如果我采用文件名的路径,它看起来像这样:/media/AB12-34/DCIM/100DCIM\media1.mp4(文件名前带有\)但我希望路径看起来像这样:/media/AB12 -34/DCIM/100DCIM/media1.mp4(文件名前有 /)。我知道它没有太大区别,但是如果我想在
猜你喜欢
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
相关资源
最近更新 更多