我正在尝试读取服务器上的所有文件(>2M文件),并在使用这个例子时取得了很大进展,将其过滤为只有PHP和Regex的文件。我的日子一直在尝试复制文件修改或创建时间的筛选,而不是这个PHP文档的文件名,但似乎找不到一种方法来传递我想要比较的日期。
这是我的工作起点:
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;
}这就是我试图通过复制/粘贴使用Regex的代码来实现的“伪代码”。
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');问题是,只有有效的Regex可以在示例代码中使用,并且对于我尝试过的其他类,在它的构造中不允许使用第二个参数。我似乎找不出RecursiveRegexIterator的正确替代方案,这将允许我传递一个日期值,以便将筛选器包含在上周创建/修改的PHP/HTML文件中。
发布于 2013-07-08 19:14:21
好的,您可以试试这个例子:
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;
}注意,http://php.net/manual/en/directoryiterator.getmtime.php返回时间戳,所以您也需要给它。
您所缺少的是覆盖getChildern,它将参数向下传递给子节点。
https://stackoverflow.com/questions/17533369
复制相似问题