http://php.net/manual/en/class.filesystemiterator.php
我注意到FilesystemIterator
返回按名称排序的文件。任何人都可以确认这是真的,它总会发生吗?我在文档中找不到任何内容。
另一个问题是,有没有办法通过磁盘上的创建时间来获取文件? getCTime()
似乎会返回更改时间,因此我无法将其与usort()
答案 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);
根据需要设置标记。