2010-11-17 69 views
98

我正在寻找一个循环遍历目录中的所有文件的PHP脚本,以便我可以使用文件名(例如格式,打印或将其添加到链接)进行操作。我希望能够按名称,类型或创建/添加/修改日期对文件进行排序。 (想想fancy directory“index”。)我还想能够将排除项添加到文件列表中,例如脚本本身或其他“系统”文件。 (如...“目录”。)PHP脚本循环浏览目录中的所有文件?

因为我希望能够修改脚本,所以我更感兴趣的是查看PHP文档并学习如何自己写一个。也就是说,如果有任何现有的脚本,教程和whatnot,请让我知道。

+0

http://stackoverflow.com/questions/1086105/ get-the-files-inside-a-directory/1086110#1086110 – zloctb 2015-10-28 12:05:40

回答

185

可以使用DirectoryIterator。来自php的示例手册:

<?php 
$dir = new DirectoryIterator(dirname(__FILE__)); 
foreach ($dir as $fileinfo) { 
    if (!$fileinfo->isDot()) { 
     var_dump($fileinfo->getFilename()); 
    } 
} 
?> 
+3

注意:许多服务器没有安装SPL,因此您将无法使用Di rectoryIterator类(请参阅下面的我的替代帖子)。如果你可以的话,使用这个! – NexusRex 2011-04-11 23:23:29

+1

注意[2]:确保你明白上面的''dirname()''函数将得到你放在那里的任何路径的父文件夹。在我的情况下,我认为dirname是目录名称/路径的包装,所以它不是必需的。 – willdanceforfun 2016-03-03 11:38:50

+0

另外,如果dirname是大文件系统,则内存问题很明显。在我的情况下,有1个文件,应用程序需要memory_limit约512M内存。 – abkrim 2016-11-22 08:30:27

14

使用scandir()功能:

<?php 
    $directory = '/path/to/files'; 

    if (! is_dir($directory)) { 
     exit('Invalid diretory path'); 
    } 

    $files = array(); 

    foreach (scandir($directory) as $file) { 
     if ('.' === $file) continue; 
     if ('..' === $file) continue; 

     $files[] = $file; 
    } 

    var_dump($files); 
?> 
2

glob()有关于排序和模式匹配的规定。由于返回值是一个数组,所以你可以完成你需要的大部分任务。

+1

你正在处理大量的文件...> 10,000。你会用完内存。 – NexusRex 2011-04-11 23:21:45

+0

@NexusRex:你不应该从数据库中读取10,000条记录,但是就问题而言,这超出了范围 – stillstanding 2011-04-12 02:25:00

+0

同意!如果从数据库中读取数据,则可以使用“限制”进行分页 - 但是,如果您有一个包含500万个XML文件的目录可以迭代,那么不会有这样的运气。 – NexusRex 2011-04-12 05:15:45

34

如果您没有访问DirectoryIterator类试试这个:

<?php 
$path = "/path/to/files"; 

if ($handle = opendir($path)) { 
    while (false !== ($file = readdir($handle))) { 
     if ('.' === $file) continue; 
     if ('..' === $file) continue; 

     // do something with the file 
    } 
    closedir($handle); 
} 
?> 
+3

你能说出你无法访问的情况吗? – 2013-12-29 01:40:33

+9

许多遗留应用程序使用PHP 4,它无法访问DirectoryIterator。 – 2014-03-20 14:02:52

+1

为什么'。' === $文件?这不是Java。 – 2017-08-07 20:01:10

6

您也可以使用FilesystemIterator。它需要更少的代码,然后DirectoryIterator,并自动删除...

$fileSystemIterator = new FilesystemIterator('images'); 

$entries = array(); 
foreach ($fileSystemIterator as $fileInfo){ 
    $entries[] = $fileInfo->getFilename(); 
} 

var_dump($entries); 

//OUTPUT 
object(FilesystemIterator)[1] 

array (size=14) 
    0 => string 'aa[1].jpg' (length=9) 
    1 => string 'Chrysanthemum.jpg' (length=17) 
    2 => string 'Desert.jpg' (length=10) 
    3 => string 'giphy_billclinton_sad.gif' (length=25) 
    4 => string 'giphy_shut_your.gif' (length=19) 
    5 => string 'Hydrangeas.jpg' (length=14) 
    6 => string 'Jellyfish.jpg' (length=13) 
    7 => string 'Koala.jpg' (length=9) 
    8 => string 'Lighthouse.jpg' (length=14) 
    9 => string 'Penguins.jpg' (length=12) 
    10 => string 'pnggrad16rgb.png' (length=16) 
    11 => string 'pnggrad16rgba.png' (length=17) 
    12 => string 'pnggradHDrgba.png' (length=17) 
    13 => string 'Tulips.jpg' (length=10) 

链接: http://php.net/manual/en/class.filesystemiterator.php

0

您可以使用此代码回路thorugh目录recusivly

$path = "/home/myhome"; 
$rdi = new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::KEY_AS_PATHNAME); 
foreach (new RecursiveIteratorIterator($rdi, RecursiveIteratorIterator::SELF_FIRST) as $file => $info) { 
    echo $file."\n"; 
} 
5
$files = glob('folder/*.{jpg,png,gif}', GLOB_BRACE); 

foreach($files as $file) 
{  
    //do your work here  
} 
+0

喜欢这个解决方案。这是否也会查找嵌套文件,或者仅查找指定目录中的文件? – 2018-02-01 21:20:06

+0

只有当前目录Joe。 – 2018-02-10 11:43:32

相关问题