3

在php中给定日期之后获取新文件列表的最有效方法是什么,或者可能使用系统调用?

我可以完全控制收到文件时文件的存储方式,所以我认为最好将它们存储在像年/月/日/文件名这样的文件夹结构中,然后我所要做的就是扫描大于或等于我想使用 scandir 检索并将目录名称转换为 int 值的日期。但我不确定我是否遗漏了一些能让这更容易/更快的东西。我对执行此操作的最有效方式感兴趣,因为随着时间的推移会有很多文件堆积,我不想重新扫描旧目录。基本上,目录结构应该很适合有效的手动过滤,但我想检查一下我是否遗漏了一些东西。

简单示例用法:

'2012/12/1' contains files test1.txt, test2.txt
'2012/12/2' => test3.txt, test4.txt
'2011/11/1' => test5.txt
'2011/11/2' => test6.txt

如果我在 2011 年 11 月 2 日或之后搜索文件,那么我希望返回除 test5.txt 之外的所有文件。

提前感谢您的任何见解!

编辑:文件的存储和实际处理是两个独立的过程,所以我不能只处理它们,这显然是最好的解决方案。

4

2 回答 2

1

一般来说,我创建目录喜欢YYYY/MM/DD存储我的文件,通常为不同的源设置另一个级别。有时我会使用YYYY-MM/DD或类似的东西。请注意,十年中只有 3652 天,因此您甚至可以拥有一个类似的级别YYYY-MM-DD,而不会获得太大而难以处理的目录。如果你有一个索引目录的文件系统,你可以很容易地在一个目录中拥有成千上万个文件,否则一千个应该是你的上限。

要处理这些文件,我不会费心对目录名称进行任何实际搜索。因为我知道我感兴趣的日期,所以我可以简单地生成路径并仅扫描包含正确日期范围内的文件的目录。

例如,假设我想处理过去一周的所有文件:

for $date = today() - 7 to today():
    $path = strftime("%Y/%m/%d", $date)
    for $filename in getFiles($path):
        processFile($path, $filename)
于 2012-12-24T05:06:30.893 回答
0

根据您编写路径的方式,您似乎在 linux 或 mac 上。

find 命令可以返回在特定日期内修改(或访问)的文件列表。

// find files that were modified less than 30m ago
$filelist = system("find /path/to/files -type f -mmin -30"); 

我认为应该谨慎使用系统调用,因为它们会降低可移植性。

正如您提到的那样存储在目录中是有道理的,因为它会减少搜索空间。

于 2012-12-24T02:24:57.843 回答