2

如何对文件夹中的大量文件进行分页?

我在 PHP 文档中看不到任何提到任何指定“偏移量”的方法的函数。glob() 和 scandir() 都只是简单地返回文件夹中的所有文件,恐怕对于一个巨大的目录来说这不是一个好主意。

有没有比简单地浏览所有文件并砍掉前 X 个文件更好的方法呢?请注意,我希望有递归遍历和使用 glob() 模式的选项。

编辑:我看了很多LimitIteratorGlobIteratorRecursiveDirectoryIterator。它们看起来都不错,但如果我要将它们组合起来,我什至不知道从哪里开始(PHP SPL 文档非常稀疏)。我可能只是在想这个问题。

4

3 回答 3

2

你可以自己对结果进行分页,PHP 返回一个简单的数组,所以你可以保留一个 $offset 和 $limit 变量,这样你就知道你在数组的哪一部分。

如果您在 Web 上下文中,则可以在 GET 参数中传递这些参数。

于 2010-05-13T02:52:48.750 回答
2

只是为了给弗朗西斯科索托所说的一些代码,手动分页

$limit = 10;
$offset = (isset($_GET['offset'])) ? $_GET['offset'] : 0;
$dir = scandir($path);
for ($i = $offset; $i < $offset+$limit; $i++) {
    echo $dir[$i] . "<br />";
}
echo "<br />";
for ($i = 0; $i < count($dir); $i++) {
    echo "<a href='?offset=" . ($i*$limit) . "'>{$i}</a>";
}

非常粗糙,未经测试的代码。

于 2010-05-13T03:11:52.140 回答
2

不,没有。目录只是另一种类型的流,这就是“seek”运算符的定义方式:

static int php_plain_files_dirstream_rewind(php_stream *stream, off_t offset, int whence, off_t *newoffs TSRMLS_DC)
{
    rewinddir((DIR *)stream->abstract);
    return 0;
}

你看它只是一个倒带。因此,您必须读取前n 个条目才能读取条目n + 1。如果您想提高效率,可以第一次读取整个目录并将其用作缓存(例如存储在会话中)。阅读完所有内容后,您将转到存储数组中的偏移量 n+1。

于 2010-05-13T03:20:58.257 回答