Php 如何将RecursiveDirectoryIterator与修改的日期筛选器一起使用?
我正在尝试读取我们服务器上的所有文件(>2M个文件),并在使用Regex将其过滤为PHP和HTML文件方面取得了很大的进展。我的日子一直在尝试复制文件修改或创建时间的过滤,而不是用这个文件名,但似乎找不到一种方法来传递我想要比较的日期 以下是我的工作起点:Php 如何将RecursiveDirectoryIterator与修改的日期筛选器一起使用?,php,regex,directory,Php,Regex,Directory,我正在尝试读取我们服务器上的所有文件(>2M个文件),并在使用Regex将其过滤为PHP和HTML文件方面取得了很大的进展。我的日子一直在尝试复制文件修改或创建时间的过滤,而不是用这个文件名,但似乎找不到一种方法来传递我想要比较的日期 以下是我的工作起点: abstract class FilesystemRegexFilter extends RecursiveRegexIterator { protected $regex; public function __constru
abstract class FilesystemRegexFilter extends RecursiveRegexIterator {
protected $regex;
public function __construct(RecursiveIterator $it, $regex) {
$this->regex = $regex;
parent::__construct($it, $regex);
}
}
class FilenameFilter extends FilesystemRegexFilter {
public function accept() {
return ( ! $this->isFile() || preg_match($this->regex, $this->getFilename()));
}
}
class DirnameFilter extends FilesystemRegexFilter {
public function accept() {
return ( ! $this->isDir() || preg_match($this->regex, $this->getFilename()));
}
}
$directory = new RecursiveDirectoryIterator("c:\\www");
$filter = new DirnameFilter($directory, '/^(?!cache)/');
$filter = new FilenameFilter($filter, '/\.(?:php|inc)$/');
foreach(new RecursiveIteratorIterator($filter) as $filename => $file) {
echo $filename . PHP_EOL;
}
这就是我试图通过复制/粘贴使用正则表达式的代码来实现的“伪代码”
abstract class FilesystemDateFilter extends RecursiveSOMEKINDOFIterator {
protected $earliest_date;
public function __construct(RecursiveIterator $it, $earliest_date) {
$this->earliest_date = $earliest_date;
parent::__construct($it, $earliest_date);
}
}
class FiledateFilter extends FilesystemDateFilter {
// Filter files against the Earliest Date
public function accept() {
return ( ! $this->isFile() || $this->getMTime() >= $this->earliest_date );
}
}
$filter = new FilenameFilter($filter, '/\.(?:php|inc)$/');
$filter = new FiledateFilter($filter, '2012-12-31');
问题是示例代码中只能使用有效的正则表达式,对于我尝试过的其他类,在其构造中不允许使用第二个参数。我似乎找不到正确的替代方法来替代
RecursiveRegexIterator
,该方法允许我传递一个日期值,以便在上周创建/修改的PHP/HTML文件中包含过滤器进行比较。好的,您可以尝试以下示例:
class FilesystemDateFilter extends RecursiveFilterIterator
{
protected $earliest_date;
public function __construct(RecursiveIterator $it, $earliest_date)
{
$this->earliest_date = $earliest_date;
parent::__construct($it);
}
public function accept()
{
return ( ! $this->isFile() || $this->getMTime() >= $this->earliest_date );
}
public function getChildren()
{
return new static ( $this->getInnerIterator ()->getChildren (), $this->earliest_date );
}
}
$directory = new RecursiveDirectoryIterator("c:\\www");
$filter = new FilesystemDateFilter($directory, strtotime('2012-12-31'));
foreach(new RecursiveIteratorIterator($filter) as $filename => $file) {
echo $filename . PHP_EOL;
}
注意:返回时间戳,所以您也需要给出它
您缺少的是覆盖将参数向下传递给子级的
getChildern
。而不是尝试将其填充到RecursiveGetExitor
中,您是否考虑过只使用RecursiveFilterator
来代替它?您不需要将其传递给父级:u构造($it,$earlime\u date);因此,您可以使用递归FilterIterator,我很乐意这样做……我对整个迭代器都不熟悉,我开始的示例使用Regex来过滤文件。这节省了大量的处理时间,因此我从我知道正在工作的代码开始学习。我在谷歌上搜索了你的建议,但当你试图了解迭代器的工作原理时,像“filter”“new”“files”这样的术语并不能准确地返回任何特定的或可用的内容。只需尝试class FiledateFilter Extendes RecursiveFilterIterator
,声明一个public$earliestdate
,然后设置它(不是在它的构造函数参数中,因为签名不应该更改)。看看这是怎么回事……哦,天哪,你不想看到我为了完成这项任务而产生的可怕的混乱。要同时过滤文件名,我是否能够立即执行“$filter=new FilenameFilter($filter,“/\”(?:php | inc)$/”;”从最初的示例开始?我将很快尝试它,只是想知道它是否可行,或者是否将其构建到您给出的示例中。我不确定我是否理解您的问题,但您可以将其与您的示例一起使用,您的正则表达式搜索很好。但我仍然坚持这一点:它们都引用$this,它没有getMTime()-如何从accepti函数访问->getMTime()?我在accept函数中获得了时间,没有问题,因为它是DirectoryIterator,只是它的时间戳,我已经更新了示例。唉,我正在使用PHP5.2。需要一些时间来设置5.3环境…谢谢。