2012-12-29 80 views
24

我知道glob可以找一个文件夹内的所有文件或只有所有目录:有没有办法让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)); 

效果很好,但读取目录两次(即使有some optimizations,使第二浏览更快)。

+1

你可以'glob(“*。*”)'这不起作用,尽管如果一个文件夹包含一个'.',或者一个文件没有扩展名。 –

回答

44

我终于找到了一个解决方案:

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

,但照顾,array_filter将保留数字键:使用array_values如果你需要重新索引数组。

+0

不错! 使用foreach循环将解决array_filter中保留的数字键的问题。 – Imdad

-10
$all = glob("/*.*"); 

这将列出带有“。”的所有东西。在文件名后面。所以基本上,所有的文件。

+14

从什么时候文件需要扩展名?什么让你认为一个目录的名字中不能有一个点? –

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/

+6

在大多数情况下都可以工作,但要注意,因为如果你愿意,目录也可以命名为'toto.jpg'。 –

3

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

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

{*}意味着所有文件结尾,所以每个文件,但没有文件夹!

+2

不用,'{}'无需区分地替换文件或文件夹上的任何字符。 –

1

其他解决方案:

$files = glob('../{,.}*', GLOB_BRACE); 
foreach ($files as $i => $file) { 
    if (is_dir($file)) { 
     unset($files[$i]); 
    } 
} 

或者:

$files = glob('../{,.}*', GLOB_BRACE | GLOB_MARK); 
foreach ($files as $i => $file) { 
    if ($file[ strlen($file) - 1 ] == '/') { 
     unset($files[$i]); 
    } 
} 

两个保护数字键,因此您也许想re-index

P.S.如果您还想要get hidden files,则必须使用{,.}*', GLOB_BRACE

相关问题