在FilesystemIterator中订购

时间:2015-03-17 15:22:03

标签: php sorting iterator filesystems

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

我注意到FilesystemIterator返回按名称排序的文件。任何人都可以确认这是真的,它总会发生吗?我在文档中找不到任何内容。

另一个问题是,有没有办法通过磁盘上的创建时间来获取文件? getCTime()似乎会返回更改时间,因此我无法将其与usort()

一起使用

4 个答案:

答案 0 :(得分:1)

你必须在FilesystemIterator之外对它们进行排序,因为它只是迭代。

以下是一个例子:

$files = array();
$dir = new DirectoryIterator('.');
foreach ($dir as $fileinfo) {     
   $files[$fileinfo->getMTime()][] = $fileinfo->getFilename();
}

ksort($files);

答案 1 :(得分:1)

  

我注意到FilesystemIterator返回按名称排序的文件。任何人都可以确认这是真的,它总会发生吗?我没有在文档中找到任何内容。

您无法对来自迭代器的数据进行排序。为什么?因为Iterator对数据处理很懒惰,这意味着迭代器当时只知道大约1个项目。

因此,Iterator不会以任何方式对文件进行排序,您无法直接从迭代器中对数据进行排序,您必须将其保存到数组中,以便能够对数据进行排序。

  

另一个问题是,有没有办法通过磁盘上的创建时间来获取文件?

usort()是一个好主意,但不是DirectoryIterator::getCTime(),因为这是迭代器的一种方法。但您可以使用:filemtime()(请注意该函数已缓存!)

答案 2 :(得分:1)

我做了一些深入PHP内部的工作。

如果我没弄错的话,FileSystemIterator的__construct方法最终会使用VCWD_OPENDIR C宏:https://github.com/php/php-src/blob/2f443acad19816e29b0c944426238d9f23af1ae2/main/streams/plain_wrapper.c#L908

这是C函数opendir()的宏。

通过查看该功能的文档,我无法看到任何可以定义任何类型订单的内容:http://pubs.opengroup.org/onlinepubs/009695399/functions/opendir.html

知道这一点,我认为订单没有强制执行,可能会因使用的文件系统类型(fat32,ntfs等)而有所不同。

因此,如果我是你 - 为了安全 - 我会实现一个PHP函数,它会按照我想要的方式对它们进行排序。

关于第二个问题,请检查:PHP: how can I get file creation date?

答案 3 :(得分:0)

实际上,订单可以是随机的。所以,你必须任意排序。要按字母顺序排序,请使用以下简单结构:

$files = iterator_to_array(new RecursiveDirectoryIterator('.', FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS), true);
ksort($files);

根据需要设置标记。