我正在寻找一个 PHP 脚本,循环通过一个目录中的所有文件,所以我可以做的事情与文件名,如格式,打印或添加到一个链接。我希望能够按名称、类型或按创建/添加/修改日期对文件进行排序。(想象一下花哨的目录“ index”。)我还希望能够将排除项添加到文件列表中,比如脚本本身或其他“系统”文件。(如 .和 ..的“目录”。)
.
..
由于我希望能够修改这个脚本,所以我对查看 PHP 文档并学习如何自己编写一个文档更感兴趣。也就是说,如果有任何现有的脚本,教程和诸如此类的东西,请让我知道。
使用 scandir()函数:
scandir()
<?php $directory = '/path/to/files'; if (!is_dir($directory)) { exit('Invalid diretory path'); } $files = array(); foreach (scandir($directory) as $file) { if ($file !== '.' && $file !== '..') { $files[] = $file; } } var_dump($files); ?>
你可以使用 导演迭代器.php 手册中的例子:
<?php $dir = new DirectoryIterator(dirname(__FILE__)); foreach ($dir as $fileinfo) { if (!$fileinfo->isDot()) { var_dump($fileinfo->getFilename()); } } ?>
Globb () 有排序和模式匹配的规定。由于返回值是一个数组,因此可以执行所需的大部分其他操作。
如果您没有访问 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); } ?>
你也可以使用 FilesystemIterator。它需要更少的代码比 DirectoryIterator,并自动删除 .和 ..。
FilesystemIterator
DirectoryIterator
// Let's traverse the images directory $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
可以使用此代码循环遍历目录 递归:
$path = "/home/myhome"; $rdi = new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::KEY_AS_PATHNAME); foreach (new RecursiveIteratorIterator($rdi, RecursiveIteratorIterator::SELF_FIRST) as $file => $info) { echo $file."\n"; }
为了完整起见(因为这似乎是一个流量很大的页面) ,我们不要忘记好的老版 dir()功能:
dir()
$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);
大多数时候我想你想跳过 .和 .. 递归:
<?php $rdi = new RecursiveDirectoryIterator('.', FilesystemIterator::SKIP_DOTS); $rii = new RecursiveIteratorIterator($rdi); foreach ($rii as $di) { echo $di->getFilename(), "\n"; }
Https://php.net/class.recursivedirectoryiterator
你也可以这么做
$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