我試圖讀取我們的服務器上的所有文件(> 2M文件),並使用this example取得了巨大進展,使用正則表達式將其過濾爲只有PHP和HTML文件。我的日子一直試圖複製該文件的修改或創建時間的過濾而不是文件名,但這似乎找不到與我想要比較的日期的方式。如何使用帶有修改日期過濾器的RecursiveDirectoryIterator?
這是我工作的出發點:
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文件中。
而不是試圖把它塞進一個'RecursiveRegexIterator',你有沒有想過只用一個'RecursiveFilterIterator'來代替? – Wrikken
您不需要將它傳遞給parent :: __構造($ it,$ earliest_date);所以你可以使用'RecursiveFilterIterator' –
很想做那個....對於這個整個迭代器來說是新的東西,我開始使用Regex來過濾文件。這節省了大量的處理時間,所以從我知道的代碼開始學習曲線。我搜索了你所建議的內容,但是當你試圖學習它的工作方式時,使用迭代器來「過濾」「新」「文件」這樣的術語並不完全返回任何特定或可用的東西。 – GDP