2013-07-08 28 views
3

我試圖讀取我們的服務器上的所有文件(> 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文件中。

+1

而不是試圖把它塞進一個'RecursiveRegexIterator',你有沒有想過只用一個'RecursiveFilterIterator'來代替? – Wrikken

+0

您不需要將它傳遞給parent :: __構造($ it,$ earliest_date);所以你可以使用'RecursiveFilterIterator' –

+0

很想做那個....對於這個整個迭代器來說是新的東西,我開始使用Regex來過濾文件。這節省了大量的處理時間,所以從我知道的代碼開始學習曲線。我搜索了你所建議的內容,但是當你試圖學習它的工作方式時,使用迭代器來「過濾」「新」「文件」這樣的術語並不完全返回任何特定或可用的東西。 – GDP

回答

1

好了,你可以嘗試這個例子:

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,它將參數傳遞給孩子。

+0

哦,上帝,你不想看到我想出來的可怕混亂,以實現這一點。爲了同時過濾文件名,我能夠立即執行「$ filter = new FilenameFilter($ filter,'/\.(?:php|inc)$/');」從最初的例子?我很快就會嘗試,只是想知道是否有可能,或者是否將它構建到您提供的示例中。 – GDP

+0

不知道我理解你的問題,但你可以與你的例子一起使用它,你的正則表達式搜索很好。 –

+0

我堅持這個,雖然:他們都提到$ this,它沒有getMTim​​e() - 如何從accepti函數訪問 - > getMTim​​e()? – GDP