0

这些方法中的哪一种或其他方法最适合用于显示文件?
注意:在这个例子中,我只对显示文件名感兴趣

另外,项目是如何FilesystemIterator排序的?

以下三个示例都显示相同的结果,只是FilesystemIterator没有明显的排序顺序。

$path = "/";
exec("ls $path", $results);
foreach($results as $file){
    p($file);
}

foreach(glob($path."/*") as $file){
    p(basename($file)   );
}

foreach(new FilesystemIterator($path) as $file){
    p($file->getFilename());
}


function p($s){
    global $path;
    echo "<a href=\"$path?f=$s\">$s</a><BR>\n";
}

输出:

exec("ls ...") method
bin
boot
cdrom
dev
etc
home
initrd.img
...


glob() method
bin
boot
cdrom
dev
etc
home
initrd.img
...


FilesystemIterator() method
mnt
vmlinuz
cdrom
usr
sys
home
var
...
4

3 回答 3

1

这个怎么样 :

exec() - 是最糟糕的解决方案,因为如果用户可以管理在 exec 输入参数中输入自定义字符串,它会在您的应用程序中创建潜在的安全漏洞。由于这个原因,大多数主机阻止您使用 exec,因此如果您将应用程序部署到您不拥有的某些主机,则可以阻止此命令。

glob()、opendir/readdir 解决方案都很好,和 FilesystemIterator 一样。这取决于你,你会选择什么。优点和缺点是:

glob、opendir/readdir 等函数消耗更少的内存,因为没有创建对象,您只需获取一个字符串值数组。如果您确定,这可能很好,您唯一需要的就是文件系统中的路径列表。

FilesystemIterator 为您提供了 SplFileInfo 对象的集合,这些对象为每个项目提供了一组方法,例如 getExtension、getFullPath、getFilename,这使得使用文件/文件夹执行一些高级任务变得非常容易。

Ps.:所以在可用性方面最好的是通过 FilesystemIterator 的 OOP 方法,因为您可以获得对象,其中包含或可以获得有关目标文件/文件夹的许多信息,就简单性而言,您可以选择调用函数,例如 glob

于 2013-10-16T06:05:13.897 回答
0

每当您要求“最佳”时,您都需要定义标准,因此无法回答您的主要问题。

一些注意事项:

  • 关于迭代器中的顺序,我猜它根本不会以任何方式对文件进行排序,而是以它们存储在磁盘上的方式传递它们。这可能与 opendir()/readdir() (在 PHP 中是否有 closedir(),顺便说一句?)正在做的事情相同。不对其进行排序是有意义的:当您要按不同的属性再次对其进行排序或根本不需要对其进行排序时,您不会浪费 CPU 周期。
  • 关于第一个 (exec(..)),它创建一个新进程(这很昂贵),运行一个程序(它甚至不存在于每个系统上,但只有 POSIX 样式的),然后将输出作为单个返回字符串,您需要对其进行解析以获取单个文件。此外,直接ls将自行过滤掉隐藏文件。
  • 使用通配符进行通配符也相当昂贵,特别是如果您根本不想过滤事物。

默认情况下,我会使用目录迭代器,并根据需要对其进行排序,除非某些要求(您尚未提及的那些要求)另有说明。

于 2013-10-16T05:56:18.270 回答
0

我不确定您给出的方法的优缺点,但 PHP 确实为您提供了一组处理目录的函数。

http://www.php.net/manual/en/ref.dir.php

快速示例:

$dh = opendir("path/to/folder");
while (($file = readdir($dh)) !== false) {
    // filename will be in $file, will include "." and ".."
}
于 2013-10-16T05:39:04.053 回答