Exploración del directorio/archivo PHP
- ScottG
- Proficient


- Registrado: Jul 06, 2010
- Mensajes: 261
- Status: Offline
Así que he hecho recientemente una función para obtener todos los archivos y carpetas de una carpeta. Pensé que ID pone la función aquí así que si alguien necesita usarlo o para ver si alguien ha tenido cambios y mejoras que le gustaría compartir.
Si alguno encuentra este útil gran si tiene preguntas, inquietudes o mejoras Id encantan escucharlos
PHP Código: [ 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));
Si alguno encuentra este útil gran si tiene preguntas, inquietudes o mejoras Id encantan escucharlos
- Anonymous
- Bot


- Registrado: 25 Feb 2008
- Mensajes: ?
- Loc: Ozzuland
- Status: Online
Diciembre 7th, 2012, 1:25 pm
- spork
- Brewmaster


- Registrado: Sep 22, 2003
- Mensajes: 6129
- Loc: Seattle, WA
- Status: Offline
- ScottG
- Proficient


- Registrado: Jul 06, 2010
- Mensajes: 261
- Status: Offline
Esta función analiza todos los subdirectorios en la carpeta determinada y se aprovecha de la clase RecursiveDirectoryIterator que reduce la cantidad de código necesario para realizar la misma tarea con scandir
Por ejemplo
No la he probado para las diferencias de rendimiento entre los dos.
Por ejemplo
PHP Código: [ 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>';
- }
- ?>
No la he probado para las diferencias de rendimiento entre los dos.
- demonmaestro
- Gold Member


- Registrado: Jun 21, 2006
- Mensajes: 484
- Loc: Conroe, Texas
- Status: Offline
enfriar la idea pero hay un error...
y es que la línea
Quote:
Fatal error: excepción no capturada "RuntimeException" con el nombre de directorio del mensaje no debe estar vacía. en /test.php:22 seguimiento de la pila: #0 /test.php(22): RecursiveDirectoryIterator -> __construct () #1 {principal} en /test.php on line 23
y es que la línea
PHP Código: [ 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


- Registrado: Jul 06, 2010
- Mensajes: 261
- Status: Offline
¿Es desde el segundo bloque de código? Si ése es el caso copié el corazón de la función anterior y se olvidó de agregar una ruta de acceso. También no probar la segunda parte porque estaba dando un ejemplo. Hice el cambio y si se activa
Entonces el error debe desaparecer
PHP Código: [ 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');
Entonces el error debe desaparecer
Página 1 de 1
Para responder a este tema que necesita para ingresar o registrarse. Es gratis.
Publicar Información
- Total de mensajes en este tema: 5 mensajes
- Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 242 invitados
- No puede abrir nuevos temas en este Foro
- No puede responder a temas en este Foro
- No puede editar sus mensajes en este Foro
- No puede borrar sus mensajes en este Foro
- No puede enviar adjuntos en este Foro
