39

我知道glob可以查找所有文件或仅查找文件夹内的所有目录:

echo "All files:\n";
$all = glob("/*");
var_dump($all);

echo "Only directories\n";
$dirs = glob("/*", GLOB_ONLYDIR);
var_dump($dirs);

但是我没有找到可以有效地仅在一行中查找文件的方法。

$files = array_diff(glob("/*"), glob("/*", GLOB_ONLYDIR));

效果很好,但读取目录两次(即使有一些优化可以使第二次浏览更快)。

4

7 回答 7

58

我终于找到了解决方案:

echo "Only files\n";
$files = array_filter(glob("/*"), 'is_file');
var_dump($files);

但请注意,array_filter将保留数字键:如果需要重新索引数组,请使用array_values 。

于 2012-12-29T17:53:16.677 回答
5

您可以使用GLOB_BRACE将文档与已知文件扩展名列表进行匹配:

$files = glob("/path/to/directory/*.{jpg,gif,png,html,htm,php,ini}", GLOB_BRACE);

见:http ://www.electrictoolbox.com/php-glob-find-files/

于 2014-06-10T14:20:59.743 回答
4

有一种更简单的方法,只有一行:

$files = glob("/path/to/directory/*.{*}", GLOB_BRACE);

{*}表示所有文件结尾,所以每个文件,但没有文件夹!

于 2015-06-19T13:41:22.870 回答
0

与@AlainTiemblo 的解决方案相比,速度快了 10%,因为它不使用额外的is_file检查:

$files = array_filter(glob("/*", GLOB_MARK), function($path){ return $path[ strlen($path) - 1 ] != '/'; });

相反,它使用 inbuildGLOB_MARK标志向每个目录添加一个斜线,这样我们就可以通过array_filter()和一个匿名函数删除这些条目。

由于 PHP 7.1.0 支持负数字索引,您也可以使用它:

$files = array_filter(glob("/*", GLOB_MARK), function($path){return $path[-1] != '/';});

没有相关的速度增益,但它有助于避免这篇文章中的垂直滚动条^^

作为保留键,您应该考虑使用array_values()array_filter()重新索引数组:

$files = array_values($files);
于 2017-03-23T12:53:29.870 回答
0

反转正则表达式完成这项工作。

preg_grep(
    ';^.*(\\\\|/)$;',
    glob("/*", GLOB_MARK),
    PREG_GREP_INVERT
);

\\\\ 用于 Windows 反斜杠

于 2021-10-05T19:54:06.830 回答
-1

这对我有用。如果这对任何人都有帮助。

for file_name in glob.glob('**/*', recursive=True):
    # we get all files and dirs
    if os.path.isfile(file_name):
        # we have only the files
于 2021-11-30T12:55:32.743 回答
-10
$all = glob("/*.*");

这将用“。”列出所有内容。在文件名之后。所以基本上,所有文件。

于 2013-04-09T21:54:50.533 回答