tibberous Posted March 16, 2008 Share Posted March 16, 2008 I need a PHP script that returns a list of files: test.jpg test/test.jpg test/test.bak ect... Does anyone know where I can find one? I thought there was one on php.net, but now I can't find it... Link to comment https://forums.phpfreaks.com/topic/96343-getting-a-file-list-with-paths/ Share on other sites More sharing options...
discomatt Posted March 16, 2008 Share Posted March 16, 2008 In a folder? Did you want it to browse subfolders as well? From PHP's website: <?php $dir = "/etc/php5/"; // Open a known directory, and proceed to read its contents if (is_dir($dir)) { if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { echo "filename: $file : filetype: " . filetype($dir . $file) . "\n"; } closedir($dh); } } ?> Link to comment https://forums.phpfreaks.com/topic/96343-getting-a-file-list-with-paths/#findComment-493154 Share on other sites More sharing options...
tibberous Posted March 16, 2008 Author Share Posted March 16, 2008 Yeah - subfolders too Link to comment https://forums.phpfreaks.com/topic/96343-getting-a-file-list-with-paths/#findComment-493157 Share on other sites More sharing options...
discomatt Posted March 16, 2008 Share Posted March 16, 2008 You need a recursive function. The concept can be a little abstract at first, but properly calling a function from itself is a great way to get things like this done. Be careful when doing this though, as you can get yourself into an infinite loop quite easily. <?php // $d is the directory to loop through // $ind is whatever you want to indent each level of depth, defaut is a few non breaking spaces // $depth is the ammount of tabs to put before each file in the directory function makeTree ($d, $ind = " ", $depth = 0) { if (!is_dir($d) ) // Check if this isn't a directory return FALSE; // If not, return FALSE if (!$h = opendir($d) ) // Attempt to open a directory handle return FALSE; // If not, return FALSE echo str_repeat($ind, $depth) . '<b>'. $d .'</b><br>' . "\n"; // Echo tabs based on depth, then echo a bold directroy name while( ($f = readdir($h)) !== FALSE ) { // Loop through all files in current directory static $i = 0; // Set increment variable to 0 on first loop only if (substr($f, 0, 1) == '.') // Check if first character in file name is '.' (.htaccess, .DS_Store, ect) continue; // If it is, skip the rest of the loop and start again on the next file if (is_dir($d .'/'. $f)) // Check if this file is actually a folder makeTree($d .'/'. $f, $ind, $depth + 1); // If is is a directory, call this function to loop through THAT directory and increase the depth by 1 else // If it isn't a folder echo str_repeat($ind, $depth) . $f . '<br>' . "\n"; // Echo the file name $i++; // Increment the variable } if ($i < 1) // Check if increment variable is less than one echo str_repeat($ind, $depth) . '<small>No files...</small>' . "\n"; // Echo to the user the folder is empty } echo '<font face="Courier">'; makeTree('/Applications/MAMP/htdocs'); echo '</font>'; ?> And here's a quick modified sample of the function in use <?php function dirArray ($d, &$a) { if (!is_dir($d) ) return FALSE; if (!$h = opendir($d) ) return FALSE; $a = array(); $fa = array(); while( ($f = readdir($h)) !== FALSE ) { if (substr($f, 0, 1) == '.') continue; if (is_dir($d .'/'. $f)) dirArray($d .'/'. $f, $a[$f . '/']); else $fa[] = $f; } $a = array_merge($a, $fa); } function makeTree($a, $g = '', $o = FALSE, $c = '', $depth = 0) { if (!is_array($o) ) $o = array(); if (empty($a)) echo $g . str_repeat('|', $depth) . '-' . '<small>Folder is empty</small><br />' . "\n"; foreach ($a as $dir => $file) { echo $g . str_repeat('|', $depth) . '-'; if (is_array($file) ) { if (in_array($c . $dir, $o) ) { echo '<b><a href="?c='.$c.$dir.'">(-)</a> <a href="?open='.$c.$dir.'">'.substr($dir, 0, -1).'</a></b><br />' . "\n"; makeTree($file, $g, $o, $c.$dir, $depth+1); } else echo '<b><a href="?e='.$c.$dir.'">(+)</a> <a href="?open='.$c.$dir.'">'.substr($dir, 0, -1).'</a></b><br />' . "\n"; } else echo $file . '<br />' . "\n"; } } session_start(); if (!is_array($_SESSION['open_dirs']) ) $_SESSION['open_dirs'] = array(); if ($_GET['open']) { $_SESSION['current_dir'] = $_GET['open']; if (!in_array($_GET['open'], $_SESSION['open_dirs']) ) $_SESSION['open_dirs'][] = $_GET['open']; } if ($_GET['c']) if ( ($key = array_search($_GET['c'], $_SESSION['open_dirs'])) !== FALSE ) unset($_SESSION['open_dirs'][$key]); if ($_GET['e']) if (!in_array($_GET['e'], $_SESSION['open_dirs']) ) $_SESSION['open_dirs'][] = $_GET['e']; dirArray('/Applications/MAMP/htdocs', $return); echo '<font face="Courier">' . "\n"; makeTree($return, ' ', $_SESSION['open_dirs']); echo '</font>'; ?> Link to comment https://forums.phpfreaks.com/topic/96343-getting-a-file-list-with-paths/#findComment-493272 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.