PHP脚本循环遍历目录中的所有文件?

时间:2010-11-17 06:58:57

标签: php file

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

由于我希望能够修改脚本,我更感兴趣的是查看PHP文档并学习如何自己编写。也就是说,如果有任何现有的脚本,教程和诸如此类的东西,请告诉我。

9 个答案:

答案 0 :(得分:212)

您可以使用DirectoryIterator。 php手册中的示例:

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

答案 1 :(得分:37)

如果您无权访问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);
}
?>

答案 2 :(得分:15)

使用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);
?>

答案 3 :(得分:9)

您还可以使用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

答案 4 :(得分:3)

您可以使用此代码循环遍历目录 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 :(得分:2)

glob()提供了排序和模式匹配的规定。由于返回值是一个数组,因此您可以完成所需的大部分工作。

答案 6 :(得分:0)

出于完整性考虑(因为这似乎是人流量大的页面),请不要忘记旧的dir() function

$entries = [];
$d = dir("/"); // dir to scan
while (false !== ($entry = $d->read())) { // mind the strict bool check!
    if ($entry[0] == '.') continue; // ignore anything starting with a dot
    $entries[] = $entry;
}
$d->close();
sort($entries); // or whatever desired

print_r($entries);

答案 7 :(得分:0)

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

<?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

答案 8 :(得分:0)

你也可以这样做

$path = "/public";

$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);

foreach ($objects as $name => $object) {
  if ('.' === $object) continue;
  if ('..' === $object) continue;

str_replace('/public/', '/', $object->getPathname());

// for example : /public/admin/image.png => /admin/image.png