如何使用scandir列出文件夹和子文件夹中的所有文件,并将它们显示为select中的选项?

时间:2014-07-31 19:20:42

标签: php web web-development-server

我有一段代码要修改,以列出当前路径中的文件夹和子文件夹中的所有文件。我找到了几种可能的解决方案。我试图实际实现它们,但似乎没有任何工作,所以我不确定它们是否真正起作用或者只是我实施它们是错误的。无论哪种方式,这都是我目前的代码:

<?php 
        $currentdir = 'C:/xampp/htdocs/test/'; //change to your directory
        $dir = opendir($currentdir);
        echo '<select name="workout">';
            $file = preg_grep('/^([^.])/', scandir($dir));
            while($file = readdir($dir))
            {
                if ($file != "." && $file != "..") {
                    echo "<option value='$file'>$file</option>";
            }           
                else {
                    continue;
            }
        }
        echo '</select>';
        closedir($dir); 
?>

目前此代码显示结果:

$currentdir
   Option1
   Option2
   Option3
   SUB-FOLDER1
   SUB-FOLDER2

有人可以帮助我并告诉我如何使用现有代码编写/重写代码来显示文件夹和其他子文件夹中的文件,如下所示:

$currentdir
  Option1
  Option2
  Option3
    SUB-FOLDER1
      Option1
      Option2
      Option3
    SUB-FOLDER2
      Option1
      Option2
      Option3

我非常渴望得到一个解决方案,并提前感谢你们。

4 个答案:

答案 0 :(得分:3)

虽然其他答案都很好并且正确,但请允许我添加我的解决方案:

function dirToOptions($path = __DIR__, $level = 0) {
    $items = scandir($path);
    foreach($items as $item) {
        // ignore items strating with a dot (= hidden or nav)
        if (strpos($item, '.') === 0) {
            continue;
        }

        $fullPath = $path . DIRECTORY_SEPARATOR . $item;
        // add some whitespace to better mimic the file structure
        $item = str_repeat('&nbsp;', $level * 3) . $item;
        // file
        if (is_file($fullPath)) {
            echo "<option>$item</option>";
        }
        // dir
        else if (is_dir($fullPath)) {
            // immediatly close the optgroup to prevent (invalid) nested optgroups
            echo "<optgroup label='$item'></optgroup>";
            // recursive call to self to add the subitems
            dirToOptions($fullPath, $level + 1);
        }
    }

}

echo '<select>';
dirToOptions();
echo '</select>';

它使用recursive调用来获取子项。请注意,我在每个项目之前添加了一些空格,以更好地模仿文件结构。此外,我立即关闭optgroup,以防止以嵌套的optgroup元素结束,这是无效的HTML。

答案 1 :(得分:0)

使用DirectoryIterator查看文件夹是我的方法

$di = new DirectoryIterator("/dir");
foreach($di as $dir){
    if ($dir->isDot()) continue;
    echo "<option value='", $dir->getFilename(), "'>", $dir->getFilename(), "</option>";
}

无论如何也要查看子目录

$ri = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
foreach($ri as $dir){
    if ($dir->isDot()) continue;
    echo "<option value='", $dir->getFilename(), "'>", $dir->getFilename(), "</option>";
}

答案 2 :(得分:0)

如果您不想使用上述声明,则另一种选择:

    <?php
function listdir($currentdir){
    $dir = opendir($currentdir);
    $file = readdir($dir);
    echo "<optgroup label='$currentdir'>";
    do {
        if (is_dir($currentdir."/".$file) && $file != "." && $file != ".."){
            listdir($currentdir."/".$file);
            echo $currentdir."/".$file;
        } else if($file != "." && $file != "..") {
            echo "<option value='$file'>$file</option>";
        } else {
            continue;
        }
    } while($file = readdir($dir));
    echo "</optgroup>";
    closedir($dir); 
}
echo '<select name="workout">';
listdir('/var/www'); //change to your directory
echo '</select>';
?>

答案 3 :(得分:0)

查找指定目录下的所有文件和文件夹。

function scanDirAndSubdir($dir, &$out = []) {
    $sun = scandir($dir);

    foreach ($sun as $a => $filename) {
        $way = realpath($dir . DIRECTORY_SEPARATOR . $filename);
        if (!is_dir($way)) {
            $out[] = $way;
        } else if ($filename != "." && $filename != "..") {
            scanDirAndSubdir($way, $out);
            $out[] = $way;
        }
    }

    return $out;
}

var_dump(scanDirAndSubdir('C:/xampp/htdocs/test/'));

样本:

array (size=4)
  0 => string 'C:/xampp/htdocs/test/text1.txt' (length=30)
  1 => string 'C:/xampp/htdocs/test/text1.txt' (length=30)
  2 => string 'C:/xampp/htdocs/test/subfolder1/text8.txt' (length=41)
  3 => string 'C:/xampp/htdocs/test/subfolder4/text9.txt' (length=41)