【问题标题】:Get the files inside a directory获取目录中的文件
【发布时间】:2010-11-08 08:05:43
【问题描述】:

如何使用 PHP 获取目录中的文件名?

我无法使用谷歌找到相关的命令,所以我希望这个问题能帮助那些有类似问题的人。

【问题讨论】:

  • 这里有很多问题的重复。

标签: php


【解决方案1】:

有很多方法。较旧的方式是scandir,但DirectoryIterator 可能是最好的方式。

还有readdir(与opendir一起使用)和glob

下面是一些示例,说明如何使用每个打印当前目录中的所有文件:

DirectoryIterator用法:(推荐)

foreach (new DirectoryIterator('.') as $file) {
    if($file->isDot()) continue;
    print $file->getFilename() . '<br>';
}

scandir用法:

$files = scandir('.');
foreach($files as $file) {
    if($file == '.' || $file == '..') continue;
    print $file . '<br>';
}

opendirreaddir 用法:

if ($handle = opendir('.')) {
    while (false !== ($file = readdir($handle))) {
        if($file == '.' || $file == '..') continue;
        print $file . '<br>';
    }
    closedir($handle);
}

glob用法:

foreach (glob("*") as $file) {
    if($file == '.' || $file == '..') continue;
    print $file . '<br>';
}

正如 cmets 中提到的,glob 很好,因为我在那里使用的星号实际上可以用来对文件进行匹配,所以glob('*.txt') 会得到文件夹中的所有文本文件,glob('image_*') 会获取所有以 image_ 开头的文件

【讨论】:

  • glob 的一个优点是您可以轻松过滤文件,例如glob('*.txt') 将列出所有文本文件。
  • @EvilChookie:我唯一能想到的是 glob 和 scandir 会自动将整个文件结构加载到内存中,这只是您应该注意的事情。不确定其他任何事情。
  • @EvilChookie:看这里有些是基准测试的:stackoverflow.com/questions/2120287/directory-to-array-with-php/…
  • @Marco:您提供的链接不再有效。我找到了benchmark at phparch.com,以防有人感兴趣。
  • @Lando:有趣的链接。我讨厌这里的版主删除了非常有用的旧问题,甚至无法再讨论它们。
【解决方案2】:

旧方法是:

<?php
    $path = realpath('.'); // put in your path here
    $dir_handle = @opendir($path) or die("Unable to open $path");
    $directories = array();
    while ($file = readdir($dir_handle)) 
        $directories[] = $file;
    closedir($dir_handle);
?>

如前所述,目录迭代器可能是 PHP 5 的更好方法。

【讨论】:

    【解决方案3】:

    Paolo Bergantino's answer 很好,但现在已经过时了!
    请考虑以下官方方法来获取目录中的文件。


    FilesystemIterator

    FilesystemIterator 与其祖先DirectoryIterator 相比具有许多新功能,例如可以避免声明if($file-&gt;isDot()) continue;。另见问题Difference between DirectoryIterator and FilesystemIterator

    $it = new FilesystemIterator(__DIR__);
    foreach ($it as $fileinfo) {
        echo $fileinfo->getFilename() , PHP_EOL;
    }
    

    RecursiveDirectoryIterator

    这个 sn-p 列出所有子目录中的 PHP 文件。

    $dir   = new RecursiveDirectoryIterator(__DIR__);
    $flat  = new RecursiveIteratorIterator($dir);
    $files = new RegexIterator($flat, '/\.php$/i');
    foreach($files as $file) {
        echo $file , PHP_EOL;
    }
    

    另请参阅Wrikken's answer

    【讨论】:

      【解决方案4】:

      我想大多数时候你想跳过...。这是与 递归:

      <?php
      $o_dir = new RecursiveDirectoryIterator('.', FilesystemIterator::SKIP_DOTS);
      $o_iter = new RecursiveIteratorIterator($o_dir);
      foreach ($o_iter as $o_name) {
         echo $o_name->getFilename();
      }
      

      https://php.net/class.recursivedirectoryiterator

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-04
        相关资源
        最近更新 更多