3

我正在尝试读取我们服务器上的所有文件(> 2M 文件)并使用此示例取得了很大进展,使用正则表达式将其过滤为仅 PHP 和 HTML 文件。我的日子一直在尝试使用此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;
}

这是我试图通过复制/粘贴使用正则表达式的代码来完成的“伪代码”。

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 文件中。

4

1 回答 1

2

好的,你可以试试这个例子:

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将参数传递给孩子。

于 2013-07-08T19:14:21.127 回答