From 98a447ac363d00d856c18f34ffbd4d14cad51eb3 Mon Sep 17 00:00:00 2001 From: Pascal Kriete Date: Thu, 7 Jan 2010 18:14:28 +0000 Subject: changing the second parameter in directory_map to an integer that controls recursion depth. A depth of 0 is fully recursive to maintain backward compatibility with the boolean values. --- system/helpers/directory_helper.php | 32 ++++++++++++++------------------ user_guide/changelog.html | 1 + user_guide/helpers/directory_helper.html | 6 +++--- 3 files changed, 18 insertions(+), 21 deletions(-) diff --git a/system/helpers/directory_helper.php b/system/helpers/directory_helper.php index 791cf0d10..7de6a3c51 100644 --- a/system/helpers/directory_helper.php +++ b/system/helpers/directory_helper.php @@ -36,32 +36,30 @@ * * @access public * @param string path to source - * @param bool whether to limit the result to the top level only + * @param int depth of directories to traverse (0 = fully recursive, 1 = current dir, etc) * @return array */ if ( ! function_exists('directory_map')) { - function directory_map($source_dir, $top_level_only = FALSE, $hidden = FALSE) - { + function directory_map($source_dir, $directory_depth = 0, $hidden = FALSE) + { if ($fp = @opendir($source_dir)) { - $source_dir = rtrim($source_dir, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; - $filedata = array(); - + $filedata = array(); + $new_depth = $directory_depth - 1; + $source_dir = rtrim($source_dir, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; + while (FALSE !== ($file = readdir($fp))) { - if (($hidden == FALSE && strncmp($file, '.', 1) == 0) OR ($file == '.' OR $file == '..')) + // Remove '.', '..', and hidden files [optional] + if ( ! trim($file, '.') OR ($hidden == FALSE && $file[0] == '.')) { continue; } - - if ($top_level_only == FALSE && @is_dir($source_dir.$file)) + + if (($directory_depth < 1 OR $new_depth > 0) && @is_dir($source_dir.$file)) { - $temp_array = array(); - - $temp_array = directory_map($source_dir.$file.DIRECTORY_SEPARATOR, $top_level_only, $hidden); - - $filedata[$file] = $temp_array; + $filedata[$file] = directory_map($source_dir.$file.DIRECTORY_SEPARATOR, $new_depth, $hidden); } else { @@ -72,10 +70,8 @@ if ( ! function_exists('directory_map')) closedir($fp); return $filedata; } - else - { - return FALSE; - } + + return FALSE; } } diff --git a/user_guide/changelog.html b/user_guide/changelog.html index 93a7025f0..4758d49bc 100644 --- a/user_guide/changelog.html +++ b/user_guide/changelog.html @@ -81,6 +81,7 @@ SVN Revision:

  • Deprecated the dohash() function in favour of do_hash() for naming consistency.
  • Non-backwards compatible change made to get_dir_file_info() in the File Helper. No longer recurses by default so as to encourage responsible use (this function can cause server performance issues when used without caution).
  • +
  • Modified the second parameter of directory_map() in the Directory Helper to accept an integer to specify recursion depth.
  • diff --git a/user_guide/helpers/directory_helper.html b/user_guide/helpers/directory_helper.html index eae2c52ec..3b70799d0 100644 --- a/user_guide/helpers/directory_helper.html +++ b/user_guide/helpers/directory_helper.html @@ -78,10 +78,10 @@ and builds an array representation of it and all its contained files. Example:Note: Paths are almost always relative to your main index.php file.

    -

    Sub-folders contained within the directory will be mapped as well. If you wish to map -only the top level directory set the second parameter to true (boolean):

    +

    Sub-folders contained within the directory will be mapped as well. If you wish to control the recursion depth, +you can do so using the second parameter (integer). A depth of 1 will only map the top level directory:

    -$map = directory_map('./mydirectory/', TRUE); +$map = directory_map('./mydirectory/', 1);

    By default, hidden files will not be included in the returned array. To override this behavior, you may set a third parameter to true (boolean):

    -- cgit v1.2.3-24-g4f1b