Files
pathfinder/app/Data/Filesystem/Search.php
Mark Friedrich 647bd7db58 - BC Break: _PHP_ namespaces changed (PSR-4 standard). The _root_ namespace for all _PF_ related scripts is Exodus4D\Pathfinder
- BC Break: Project folder structure changed. Removed `app/main` dir.
- BC Break: Core _PHP_ framework + dependencies moved into `composer.json` and are no longer part of this repo
2019-12-15 22:27:17 +01:00

90 lines
2.7 KiB
PHP

<?php
/**
* Created by PhpStorm.
* User: Exodus
* Date: 25.06.2016
* Time: 16:58
*/
namespace Exodus4D\Pathfinder\Data\Filesystem;
class Search {
/**
* max file count that can be returned
*/
const DEFAULT_FILE_LIMIT = 1000;
/**
* recursive file filter by mTime
* @param string $dir
* @param null $mTime
* @param int $limit
* @return \Traversable
*/
static function getFilesByMTime(string $dir, $mTime = null, $limit = self::DEFAULT_FILE_LIMIT) : \Traversable {
$mTime = is_null($mTime) ? time() : (int)$mTime;
$filterCallback = function($current, $key, $iterator) use ($mTime) {
/**
* @var $current \RecursiveDirectoryIterator
*/
if (
!$current->isFile() || // allow recursion
(
strpos($current->getFilename(), '.') !== 0 && // skip e.g. ".gitignore"
$current->getMTime() < $mTime // filter last modification date
)
){
return true;
}
return false;
};
return self::getFilesByCallback($dir, $filterCallback, $limit);
}
/**
* recursive file filter by size
* @param string $dir
* @param int $size
* @param int $limit
* @return \Traversable
*/
static function getFilesBySize(string $dir, int $size = 0, int $limit = self::DEFAULT_FILE_LIMIT) : \Traversable {
$filterCallback = function($current, $key, $iterator) use ($size) {
/**
* @var $current \RecursiveDirectoryIterator
*/
if (
!$current->isFile() || // allow recursion
(
strpos($current->getFilename(), '.') !== 0 && // skip e.g. ".gitignore"
$current->getSize() > $size // filter file size
)
){
return true;
}
return false;
};
return self::getFilesByCallback($dir, $filterCallback, $limit);
}
/**
* @param string $dir
* @param \Closure $filterCallback
* @param int $limit
* @return \Traversable
*/
private static function getFilesByCallback(string $dir, \Closure $filterCallback, int $limit = self::DEFAULT_FILE_LIMIT) : \Traversable {
$files = new \ArrayIterator();
if(is_dir($dir)){
$directory = new \RecursiveDirectoryIterator( $dir, \FilesystemIterator::SKIP_DOTS );
$files = new \RecursiveCallbackFilterIterator($directory, $filterCallback);
}
return new \LimitIterator($files, 0, $limit);
}
}