PHP Directory/File Scan
- ScottG
- Proficient


- Joined: Jul 06, 2010
- Posts: 280
- Status: Offline
So I recently made a function to get all the files and/or folders of a folder. I thought I'd put the function here so if anyone needed to use it or to see if anyone had any improvements they would like to share.
If any one finds this useful great if any one has questions, concerns or improvements I'd love to hear them
PHP Code: [ Select ]
// This funtion will get all files and directories of folder.
function get_tree($config = array()) {
// Setup the defaults. I choose to set it up like this due to how cluttered the normal way looked
$file_types = empty($config['file_types']) ? array() : $config['file_types'];
$path = empty($config['path']) ? __DIR__ : realpath($config['path']);
$include_directories = (empty($config['include_directories']) || $config['include_directories'] === false) ? false : true;
$directories_only = (empty($config['directories_only']) || $config['directories_only'] === false) ? false : true;
$skip_dots = !isset($config['skip_dots']) ? true : (($config['skip_dots'] === false) ? false : true);
$remove_root = !isset($config['remove_root']) ? true : (($config['remove_root'] === false) ? false : true);
// Make an array to hold the paths
$return_array = array();
// Setup the directory
$directory = new RecursiveDirectoryIterator($path);
// Get the directory and files
$objects = new RecursiveIteratorIterator($directory, RecursiveIteratorIterator::SELF_FIRST);
// Make sure the file types array is empty if $directories_only is set to true
$file_types = ($directories_only) ? array() : $file_types;
// Setup force extenstion add
$force_extenstions = ((empty($file_types) && $include_directories && !$directories_only) || (empty($file_types) && !$include_directories && !$directories_only)) ? true : false;
// See if we want to include directories
if($include_directories || $directories_only) {
// Add to file types
$file_types[] = 'directory';
// Check to see if we what to add the dot paths
if(!$skip_dots) {
// Add to file types
$file_types[] = 'dot_directory';
}
}
// Loop through the directory and files
foreach($objects as $name => $object) {
// Get the info on the path
$info = pathinfo($name);
// Check $force_extenstions
if($force_extenstions) {
// Check to see if we already have the extenstion
if(!in_array($info['extension'], $file_types)) {
// Add the extension
$file_types[] = $info['extension'];
}
}
// Fix blank
$info['extension'] = (empty($info['extension'])) ? ((substr($name,-1) == '.') ? 'dot_directory' : 'directory') : $info['extension'];
// Check for the file types
if(in_array(strtolower($info['extension']), $file_types)) {
// See if we want to remove the root
if($remove_root) {
// Add to the array
$return_array[] = str_replace($path, '', $name);
} else {
// Add to the array
$return_array[] = $name;
}
}
}
// Return the array
return $return_array;
}
// The config array I decided to go this route so I didn't have a bunch of optional variables just to get one functional part of the function
// for example: instead of get_tree(array(),false, true, false); I could simply do get_tree(array("directories_only" => true, "skip_dots" => false));
//
// Config array options
//
// $config = array(
// "file_types" => array('php','js'),
// "path" => '../path/to/folder',
// "include_directories" => true,
// "directories_only" => true,
// "skip_dots" => true,
// "remove_root" => true
// );
//
// "file_types" - This is the extensions of the files you want to find.
// "path" - Path to the folder you want to scan.
// "include_directories" - If set to true this will return both the directories and the files.
// "directories_only" - If this is set to true is will over ride the file_types array and return only the directories.
// "skip_dots" - If this is set to true is will skip over the '.' and '..' paths.
// "remove_root" - This will remove the root directory path up to the path variable set if set to true.
//
// Defaults
//
// "file_types" - array().
// "path" - __DIR__.
// "include_directories" - false.
// "directories_only" - false.
// "skip_dots" - true.
// "remove_root" - true.
//
// Usage
//
// Get all files only
$test = get_tree();
// Get only php files
$test = get_tree(array("file_types" => array('php')));
// Get php and js files
$test = get_tree(array("file_types" => array('php', js)));
// Get only php files and the subdirectories
$test = get_tree(array("file_types" => array('php'), "include_directories" => true));
// Get only directories
$test = get_tree(array("directories_only" => true));
// Get only directories with dot paths
$test = get_tree(array("directories_only" => true, "skip_dots" => false));
// Get all files with root path
$test = get_tree(array("remove_root" => false));
function get_tree($config = array()) {
// Setup the defaults. I choose to set it up like this due to how cluttered the normal way looked
$file_types = empty($config['file_types']) ? array() : $config['file_types'];
$path = empty($config['path']) ? __DIR__ : realpath($config['path']);
$include_directories = (empty($config['include_directories']) || $config['include_directories'] === false) ? false : true;
$directories_only = (empty($config['directories_only']) || $config['directories_only'] === false) ? false : true;
$skip_dots = !isset($config['skip_dots']) ? true : (($config['skip_dots'] === false) ? false : true);
$remove_root = !isset($config['remove_root']) ? true : (($config['remove_root'] === false) ? false : true);
// Make an array to hold the paths
$return_array = array();
// Setup the directory
$directory = new RecursiveDirectoryIterator($path);
// Get the directory and files
$objects = new RecursiveIteratorIterator($directory, RecursiveIteratorIterator::SELF_FIRST);
// Make sure the file types array is empty if $directories_only is set to true
$file_types = ($directories_only) ? array() : $file_types;
// Setup force extenstion add
$force_extenstions = ((empty($file_types) && $include_directories && !$directories_only) || (empty($file_types) && !$include_directories && !$directories_only)) ? true : false;
// See if we want to include directories
if($include_directories || $directories_only) {
// Add to file types
$file_types[] = 'directory';
// Check to see if we what to add the dot paths
if(!$skip_dots) {
// Add to file types
$file_types[] = 'dot_directory';
}
}
// Loop through the directory and files
foreach($objects as $name => $object) {
// Get the info on the path
$info = pathinfo($name);
// Check $force_extenstions
if($force_extenstions) {
// Check to see if we already have the extenstion
if(!in_array($info['extension'], $file_types)) {
// Add the extension
$file_types[] = $info['extension'];
}
}
// Fix blank
$info['extension'] = (empty($info['extension'])) ? ((substr($name,-1) == '.') ? 'dot_directory' : 'directory') : $info['extension'];
// Check for the file types
if(in_array(strtolower($info['extension']), $file_types)) {
// See if we want to remove the root
if($remove_root) {
// Add to the array
$return_array[] = str_replace($path, '', $name);
} else {
// Add to the array
$return_array[] = $name;
}
}
}
// Return the array
return $return_array;
}
// The config array I decided to go this route so I didn't have a bunch of optional variables just to get one functional part of the function
// for example: instead of get_tree(array(),false, true, false); I could simply do get_tree(array("directories_only" => true, "skip_dots" => false));
//
// Config array options
//
// $config = array(
// "file_types" => array('php','js'),
// "path" => '../path/to/folder',
// "include_directories" => true,
// "directories_only" => true,
// "skip_dots" => true,
// "remove_root" => true
// );
//
// "file_types" - This is the extensions of the files you want to find.
// "path" - Path to the folder you want to scan.
// "include_directories" - If set to true this will return both the directories and the files.
// "directories_only" - If this is set to true is will over ride the file_types array and return only the directories.
// "skip_dots" - If this is set to true is will skip over the '.' and '..' paths.
// "remove_root" - This will remove the root directory path up to the path variable set if set to true.
//
// Defaults
//
// "file_types" - array().
// "path" - __DIR__.
// "include_directories" - false.
// "directories_only" - false.
// "skip_dots" - true.
// "remove_root" - true.
//
// Usage
//
// Get all files only
$test = get_tree();
// Get only php files
$test = get_tree(array("file_types" => array('php')));
// Get php and js files
$test = get_tree(array("file_types" => array('php', js)));
// Get only php files and the subdirectories
$test = get_tree(array("file_types" => array('php'), "include_directories" => true));
// Get only directories
$test = get_tree(array("directories_only" => true));
// Get only directories with dot paths
$test = get_tree(array("directories_only" => true, "skip_dots" => false));
// Get all files with root path
$test = get_tree(array("remove_root" => false));
- // This funtion will get all files and directories of folder.
- function get_tree($config = array()) {
- // Setup the defaults. I choose to set it up like this due to how cluttered the normal way looked
- $file_types = empty($config['file_types']) ? array() : $config['file_types'];
- $path = empty($config['path']) ? __DIR__ : realpath($config['path']);
- $include_directories = (empty($config['include_directories']) || $config['include_directories'] === false) ? false : true;
- $directories_only = (empty($config['directories_only']) || $config['directories_only'] === false) ? false : true;
- $skip_dots = !isset($config['skip_dots']) ? true : (($config['skip_dots'] === false) ? false : true);
- $remove_root = !isset($config['remove_root']) ? true : (($config['remove_root'] === false) ? false : true);
- // Make an array to hold the paths
- $return_array = array();
- // Setup the directory
- $directory = new RecursiveDirectoryIterator($path);
- // Get the directory and files
- $objects = new RecursiveIteratorIterator($directory, RecursiveIteratorIterator::SELF_FIRST);
- // Make sure the file types array is empty if $directories_only is set to true
- $file_types = ($directories_only) ? array() : $file_types;
- // Setup force extenstion add
- $force_extenstions = ((empty($file_types) && $include_directories && !$directories_only) || (empty($file_types) && !$include_directories && !$directories_only)) ? true : false;
- // See if we want to include directories
- if($include_directories || $directories_only) {
- // Add to file types
- $file_types[] = 'directory';
- // Check to see if we what to add the dot paths
- if(!$skip_dots) {
- // Add to file types
- $file_types[] = 'dot_directory';
- }
- }
- // Loop through the directory and files
- foreach($objects as $name => $object) {
- // Get the info on the path
- $info = pathinfo($name);
- // Check $force_extenstions
- if($force_extenstions) {
- // Check to see if we already have the extenstion
- if(!in_array($info['extension'], $file_types)) {
- // Add the extension
- $file_types[] = $info['extension'];
- }
- }
- // Fix blank
- $info['extension'] = (empty($info['extension'])) ? ((substr($name,-1) == '.') ? 'dot_directory' : 'directory') : $info['extension'];
- // Check for the file types
- if(in_array(strtolower($info['extension']), $file_types)) {
- // See if we want to remove the root
- if($remove_root) {
- // Add to the array
- $return_array[] = str_replace($path, '', $name);
- } else {
- // Add to the array
- $return_array[] = $name;
- }
- }
- }
- // Return the array
- return $return_array;
- }
- // The config array I decided to go this route so I didn't have a bunch of optional variables just to get one functional part of the function
- // for example: instead of get_tree(array(),false, true, false); I could simply do get_tree(array("directories_only" => true, "skip_dots" => false));
- //
- // Config array options
- //
- // $config = array(
- // "file_types" => array('php','js'),
- // "path" => '../path/to/folder',
- // "include_directories" => true,
- // "directories_only" => true,
- // "skip_dots" => true,
- // "remove_root" => true
- // );
- //
- // "file_types" - This is the extensions of the files you want to find.
- // "path" - Path to the folder you want to scan.
- // "include_directories" - If set to true this will return both the directories and the files.
- // "directories_only" - If this is set to true is will over ride the file_types array and return only the directories.
- // "skip_dots" - If this is set to true is will skip over the '.' and '..' paths.
- // "remove_root" - This will remove the root directory path up to the path variable set if set to true.
- //
- // Defaults
- //
- // "file_types" - array().
- // "path" - __DIR__.
- // "include_directories" - false.
- // "directories_only" - false.
- // "skip_dots" - true.
- // "remove_root" - true.
- //
- // Usage
- //
- // Get all files only
- $test = get_tree();
- // Get only php files
- $test = get_tree(array("file_types" => array('php')));
- // Get php and js files
- $test = get_tree(array("file_types" => array('php', js)));
- // Get only php files and the subdirectories
- $test = get_tree(array("file_types" => array('php'), "include_directories" => true));
- // Get only directories
- $test = get_tree(array("directories_only" => true));
- // Get only directories with dot paths
- $test = get_tree(array("directories_only" => true, "skip_dots" => false));
- // Get all files with root path
- $test = get_tree(array("remove_root" => false));
If any one finds this useful great if any one has questions, concerns or improvements I'd love to hear them
- Anonymous
- Bot


- Joined: 25 Feb 2008
- Posts: ?
- Loc: Ozzuland
- Status: Online
December 7th, 2012, 1:25 pm
- spork
- Brewmaster


- Joined: Sep 22, 2003
- Posts: 6134
- Loc: Seattle, WA
- Status: Offline
- ScottG
- Proficient


- Joined: Jul 06, 2010
- Posts: 280
- Status: Offline
This function scans all sub-directories in the given folder and takes advantage of the RecursiveDirectoryIterator class which reduces the amount of code needed to do the same task with scandir
For example
I haven't tested for any performance differences between the two.
For example
PHP Code: [ Select ]
<?php
// Quick recursive scandir
function recursiveScanDir($dir){
$files = scandir($dir);
foreach($files as $file){
if ($file != '.' && $file != '..'){
if (is_dir($dir . DIRECTORY_SEPARATOR . $file)){
recursiveScanDir($dir . DIRECTORY_SEPARATOR . $file);
}else{
echo $dir . DIRECTORY_SEPARATOR . $file . PHP_EOL . '<br>';
}
}
}
}
recursiveScanDir(__DIR__);
?>
<br>
<br>
<?php
// RecursiveDirectoryIterator in this function
$directory = new RecursiveDirectoryIterator(__DIR__);
$objects = new RecursiveIteratorIterator($directory, RecursiveIteratorIterator::SELF_FIRST);
foreach($objects as $name => $object) {
echo $name. '<br>';
}
?>
// Quick recursive scandir
function recursiveScanDir($dir){
$files = scandir($dir);
foreach($files as $file){
if ($file != '.' && $file != '..'){
if (is_dir($dir . DIRECTORY_SEPARATOR . $file)){
recursiveScanDir($dir . DIRECTORY_SEPARATOR . $file);
}else{
echo $dir . DIRECTORY_SEPARATOR . $file . PHP_EOL . '<br>';
}
}
}
}
recursiveScanDir(__DIR__);
?>
<br>
<br>
<?php
// RecursiveDirectoryIterator in this function
$directory = new RecursiveDirectoryIterator(__DIR__);
$objects = new RecursiveIteratorIterator($directory, RecursiveIteratorIterator::SELF_FIRST);
foreach($objects as $name => $object) {
echo $name. '<br>';
}
?>
- <?php
- // Quick recursive scandir
- function recursiveScanDir($dir){
- $files = scandir($dir);
- foreach($files as $file){
- if ($file != '.' && $file != '..'){
- if (is_dir($dir . DIRECTORY_SEPARATOR . $file)){
- recursiveScanDir($dir . DIRECTORY_SEPARATOR . $file);
- }else{
- echo $dir . DIRECTORY_SEPARATOR . $file . PHP_EOL . '<br>';
- }
- }
- }
- }
- recursiveScanDir(__DIR__);
- ?>
- <br>
- <br>
- <?php
- // RecursiveDirectoryIterator in this function
- $directory = new RecursiveDirectoryIterator(__DIR__);
- $objects = new RecursiveIteratorIterator($directory, RecursiveIteratorIterator::SELF_FIRST);
- foreach($objects as $name => $object) {
- echo $name. '<br>';
- }
- ?>
I haven't tested for any performance differences between the two.
- demonmaestro
- Gold Member


- Joined: Jun 21, 2006
- Posts: 487
- Loc: Conroe, Texas
- Status: Offline
cool idea but theres an error...
and that line is
Quote:
Fatal error: Uncaught exception 'RuntimeException' with message 'Directory name must not be empty.' in /test.php:22 Stack trace: #0 /test.php(22): RecursiveDirectoryIterator->__construct('') #1 {main} thrown in /test.php on line 22
and that line is
PHP Code: [ Select ]
$directory = new RecursiveDirectoryIterator($path);
Thanks, Josh --DemonMaestro
www.LilNetwork.com
Fun Website www.ShoutsCloud.com
www.LilNetwork.com
Fun Website www.ShoutsCloud.com
- ScottG
- Proficient


- Joined: Jul 06, 2010
- Posts: 280
- Status: Offline
Is that from the second block of code? If that's the case I copied the heart out of the function above and forgot to add a path. I also didn't test the second part because I was giving an example. I made the change and for if you turn
Then the error should go away
PHP Code: [ Select ]
$directory = new RecursiveDirectoryIterator($path);
// To
$directory = new RecursiveDirectoryIterator(__DIR__);
// Or
$directory = new RecursiveDirectoryIterator('/your/folder/path');
// To
$directory = new RecursiveDirectoryIterator(__DIR__);
// Or
$directory = new RecursiveDirectoryIterator('/your/folder/path');
- $directory = new RecursiveDirectoryIterator($path);
- // To
- $directory = new RecursiveDirectoryIterator(__DIR__);
- // Or
- $directory = new RecursiveDirectoryIterator('/your/folder/path');
Then the error should go away
Page 1 of 1
To Reply to this topic you need to LOGIN or REGISTER. It is free.
Post Information
- Total Posts in this topic: 5 posts
- Users browsing this forum: No registered users and 153 guests
- You cannot post new topics in this forum
- You cannot reply to topics in this forum
- You cannot edit your posts in this forum
- You cannot delete your posts in this forum
- You cannot post attachments in this forum
