douzhi3105 2014-04-28 15:00
浏览 31
已采纳

输出多个目录中的所有mp4文件

I have a problem. I want to output all file names that have an extension .mp4. The following code could make it, but it only outputs from one directory.

<?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);

I want the script to output all .mp4 files from all directories that are in /media/AB*/DCIM/100DCIM (please note the star) directory. Is there any way of doing this using opendir command? Tried with * but it was not working.

  • 写回答

1条回答 默认 最新

  • doukun0888 2014-04-28 15:13
    关注

    Using PHP5's in-built RecursiveDirectoryIterator something like:

    <?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;
    ?>
    

    Edit (added time, see comment):

    As you basically have the full path to the file, you could add filectime($filename); within the iterator function or add it outside when doing the display loop, below is doing it inside the function.

    <?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;
    ?>
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 BP神经网络控制倒立摆
  • ¥20 要这个数学建模编程的代码 并且能完整允许出来结果 完整的过程和数据的结果
  • ¥15 html5+css和javascript有人可以帮吗?图片要怎么插入代码里面啊
  • ¥30 Unity接入微信SDK 无法开启摄像头
  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算