جستجو فایل ها در php به صورت Recursive

جستجو فایل ها در php به صورت Recursive

اینجوری شد که این اسکریپت رو نوشتم :

چند روز پیش هاست وبسایت یکی از مشتران قدیم، که با جوملا طراحی شده بود ساسپند شد.

هاستینگ به علت اراسل ایمیل های اسپم هاست رو ساسپند کرده بود . بعد از جویا شدن از هاستینگ آنها محل ارسال اسپم رو برای من ارسال کردند.
محل اراسل اسپم از چند پوشه مختلف در روزهای مختلف و همگی پوشه ها خالی بودند و هیچ فایل مخربی اونجا ندیدم ، تمام پسورد ها از مدیریت جوملا تا هاست و اف تی پی رو عوض کردم، به این نتیجه رسیدم که هکر توانایی آپلود فایل و حذف اونها رو هرجایی که بخواد داره پس اولین چیزی که به ذهنم رسید این بود که آیا فایل هایی رو توی سیستم تغییر داده ؟!

به cPanel وارد شدم و توی فایل منیجر سعی کردم فایل های ویرایش شده و یا ایجاد شده رو توی چند روز اخیر پیدا کنم ، ولی فایل منیجر cPanel قابلیت اینکار رو نداشت.
توجه داشته باشید اسکریپت زیر از لحاظ Performance تایید نمی شود و برای رفع نیاز و استفاده سریع نوشته شده

<?php

	class FilesystemDateFilter extends RecursiveFilterIterator 
	{
		protected $begin_date;
		public function __construct(RecursiveIterator $it, $begin_date) 
		{
			$this->begin_date = $begin_date;
			parent::__construct($it);
		}
		public function accept() 
		{
			return ( !$this->isFile()  or  ( $this->isFile() && ( date($this->getMTime()) >= date($this->begin_date))) );
		}
		public function getChildren() 
		{
			return new static ( $this->getInnerIterator ()->getChildren (), $this->begin_date);
		}   
	}
	
	$directory = new RecursiveDirectoryIterator(".");
	$filter = new FilesystemDateFilter($directory, strtotime("2015-11-10"));
	
	foreach(new RecursiveIteratorIterator($filter) as $filename => $file) {
		echo date( 'jS F, Y h:i:s A' ,$file->getMTime()). "-------" . $filename. "<br/>";
	}
?>

 

خط 22 ابتدای تاریخ ویرایش فایل را مشخص میکند و تمام فایل های از این تاریخ تا آن لحظه نمایش داده می شوند.
میتونید بجای getMTime در خط های 13 و 22 getCTime قرار دهید که با اینکار فایل ها بجای تاریخ ویرایش بر اساس تاریخ تولید فیلتر خواهد شد.

اگر میخواهید

  • پوشه ها نمایش داده نشوند
  • فایل ها و یا پوشه هایی با نام خاص در نتیجه نمایش داده نشوند
  • فایل ها یا پوشه های بعداز تاریخ خاصی نمایش داده نشوند
  • و یا هر فیلتر اضافی که مد نظرتون هست

میتوانید شرط های خود را در زمان نمایش اعمال کنید و اسکریپتی شبیه به این بنویسید

foreach(new RecursiveIteratorIterator($filter) as $filename => $file) {
	if($file->isFile()){
		if(strpos($filename,'cache') == false){
			if($file->getMTime() <= strtotime("2015-11-21")){
				echo date( 'jS F, Y h:i:s A' ,$file->getMTime()). "-------" . $filename. "<br/>";
			}
		}
	}
}