文件系统迭代器中的顺序

Order in FilesystemIterator

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

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

另外一个问题,有什么办法可以让磁盘上的文件按创建时间排序? getCTime() 似乎 return 更改时间所以我不能将它与 usort()

一起使用

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

这是一个例子:

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

ksort($files);

I noticed that FilesystemIterator returns the files ordered by name. Can anyone confirm this is true and it always happens? I haven't found anything in the docs.

您无法对来自迭代器的数据进行排序。为什么?因为迭代器在数据处理方面是惰性的,这意味着迭代器当时只知道 1 个项目。

因此,迭代器不会以任何方式对文件进行排序,并且您不能直接从迭代器对数据进行排序,您必须将其保存到数组中,这样才能对数据进行排序。

Another question, is there any way to get the files ordered by the creation time on the disk?

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

我深入研究了 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?

其实顺序是可以随意的。所以,你必须任意排序。要按字母顺序排序,请使用这个简单的结构:

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

根据需要设置标志。