Last active
January 14, 2021 20:36
-
-
Save StolenThunda/abe279d4c1db6e7e1b1353eb7e319d61 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
source: http://php.net/manual/en/function.scandir.php | |
Thanks to gambit_642 AT hotmailDOTcom 4 years ago | |
Needed something that could return the contents of single or multiple directories, recursively or non-recursively, | |
for all files or specified file extensions that would be | |
accessible easily from any scope or script. | |
And I wanted to allow overloading cause sometimes I'm too lazy to pass all params. | |
*/ | |
class scanDir { | |
static private $directories, $files, $ext_filter, $recursive; | |
// ---------------------------------------------------------------------------------------------- | |
// scan(dirpath::string|array, extensions::string|array, recursive::true|false) | |
static public function scan(){ | |
// Initialize defaults | |
self::$recursive = false; | |
self::$directories = array(); | |
self::$files = array(); | |
self::$ext_filter = false; | |
// Check we have minimum parameters | |
if(!$args = func_get_args()){ | |
die("Must provide a path string or array of path strings"); | |
} | |
if(gettype($args[0]) != "string" && gettype($args[0]) != "array"){ | |
die("Must provide a path string or array of path strings"); | |
} | |
// Check if recursive scan | default action: no sub-directories | |
if(isset($args[2]) && $args[2] == true){self::$recursive = true;} | |
// Was a filter on file extensions included? | default action: return all file types | |
if(isset($args[1])){ | |
if(gettype($args[1]) == "array"){self::$ext_filter = array_map('strtolower', $args[1]);} | |
else | |
if(gettype($args[1]) == "string"){self::$ext_filter[] = strtolower($args[1]);} | |
} | |
// Grab path(s) | |
self::verifyPaths($args[0]); | |
return self::$files; | |
} | |
static private function verifyPaths($paths){ | |
$path_errors = array(); | |
if(gettype($paths) == "string"){$paths = array($paths);} | |
foreach($paths as $path){ | |
if(is_dir($path)){ | |
self::$directories[] = $path; | |
$dirContents = self::find_contents($path); | |
} else { | |
$path_errors[] = $path; | |
} | |
} | |
if($path_errors){echo "The following directories do not exists<br />";die(var_dump($path_errors));} | |
} | |
// This is how we scan directories | |
static private function find_contents($dir){ | |
$result = array(); | |
$root = scandir($dir); | |
foreach($root as $value){ | |
if($value === '.' || $value === '..') {continue;} | |
if(is_file($dir.DIRECTORY_SEPARATOR.$value)){ | |
if(!self::$ext_filter || in_array(strtolower(pathinfo($dir.DIRECTORY_SEPARATOR.$value, PATHINFO_EXTENSION)), self::$ext_filter)){ | |
self::$files[] = $result[] = $dir.DIRECTORY_SEPARATOR.$value; | |
} | |
continue; | |
} | |
if(self::$recursive){ | |
foreach(self::find_contents($dir.DIRECTORY_SEPARATOR.$value) as $value) { | |
self::$files[] = $result[] = $value; | |
} | |
} | |
} | |
// Return required for recursive search | |
return $result; | |
} | |
} | |
?> | |
Usage: | |
scanDir::scan(path(s):string|array, [file_extensions:string|array], [subfolders?:true|false]); | |
<?php | |
//Scan a single directory for all files, no sub-directories | |
$files = scanDir::scan('D:\Websites\temp'); | |
//Scan multiple directories for all files, no sub-dirs | |
$dirs = array( | |
'D:\folder'; | |
'D:\folder2'; | |
'C:\Other'; | |
); | |
$files = scanDir::scan($dirs); | |
// Scan multiple directories for files with provided file extension, | |
// no sub-dirs | |
$files = scanDir::scan($dirs, "jpg"); | |
//or with an array of extensions | |
$file_ext = array( | |
"jpg", | |
"bmp", | |
"png" | |
); | |
$files = scanDir::scan($dirs, $file_ext); | |
// Scan multiple directories for files with any extension, | |
// include files in recursive sub-folders | |
$files = scanDir::scan($dirs, false, true); | |
// Multiple dirs, with specified extensions, include sub-dir files | |
$files = scanDir::scan($dirs, $file_ext, true); | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment