获取目录中的文件

Gra*_*ton 47 php

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

我找不到使用谷歌的相关命令,所以我希望这个问题可以帮助那些提出类似问题的人.

Pao*_*ino 77

有很多方法.较老的方法是scandir,但 DirectoryIterator可能是最好的办法.

还有readdir(用于opendir)和glob.

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

DirectoryIterator 用法:(推荐)

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

scandir 用法:

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

opendirreaddir用法:

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

glob 用法:

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

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

  • glob的一个优点是你可以轻松过滤文件,例如`glob('*.txt')`将列出所有文本文件. (8认同)
  • 这些方法中是否存在性能问题? (5认同)
  • @Marco:您提供的链接不再有效.如果有人感兴趣,我在[phparch.com](http://www.phparch.com/2010/04/putting-glob-to-the-test/)找到了[基准测试]. (3认同)
  • @EvilChookie:我唯一能想到的是 glob 和 scandir 自动将整个文件结构加载到内存中,这只是你应该注意的事情。不确定其他的事情。 (2认同)

oli*_*bre 7

保罗Bergantino的答案是罚款,但现在已经过时!
请考虑以下官方方法将文件放入目录中.


FilesystemIterator

FilesystemIterator与其祖先相比具有许多新功能DirectoryIterator,例如避免声明的可能性if($file->isDot()) continue;.另见问题DirectoryIterator和之间FilesystemIterator区别.

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

RecursiveDirectoryIterator

此代码段列出了所有子目录中的PHP文件.

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

另见Wrikken的答案.