Would you like to view your directories in your browser this script might come in handy.
<?php
$sub = ($_GET['dir']);
$path = 'enter/your/directory/here/';
$path = $path . "$sub";
$dh = opendir($path);
$i=1;
while (($file = readdir($dh)) !== false) {
if($file != "." && $file != "..") {
if (substr($file, -4, -3) =="."){
echo "$i. $file <br />";
}else{
echo "$i. <a href='?dir=$sub/$file'>$file</a><br />";
}
$i++;
}
}
closedir($dh);
?>
opendir
(PHP 4, PHP 5)
opendir — Ouvre un dossier, et récupère un pointeur dessus
Description
opendir() retourne un pointeur sur un dossier qui pour être utilisé avec les fonctions closedir(), readdir() et rewinddir().
Liste de paramètres
- path
-
Le chemin du répertoire à ouvrir
- context
-
Pour la description du paramètre context , référez-vous à la section des flux du manuel.
Valeurs de retour
Retourne la ressource de dossier en cas de succès ou FALSE en cas d'échec.
Si le paramètre path n'est pas un dossier valide, ou si le dossier ne peut être accédé pour des raisons de permissions ou des erreurs liées au système de fichiers, opendir() retourne FALSE et génère une erreur PHP de niveau E_WARNING. Vous pouvez supprimer cette erreur en ajoutant '@' avant le nom de la fonction.
Historique
| Version | Description |
|---|---|
| 5.0.0 | path supporte l'enveloppe URL ftp:// |
| 4.3.0 | path peut aussi être n'importe quel URL qui supporte le listage de dossiers, par contre, seul l'enveloppe URL file:// supporte ceci en PHP 4. |
Exemples
Exemple #1 Exemple avec opendir()
<?php
$dir = "/tmp/php5";
// Ouvre un dossier bien connu, et liste tous les fichiers
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
echo "fichier : $file : type : " . filetype($dir . $file) . "\n";
}
closedir($dh);
}
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
fichier : . : type : dir fichier : .. : type : dir fichier : apache : type : dir fichier : cgi : type : dir fichier : cli : type : dir
opendir
11-Dec-2007 09:01
07-Dec-2007 03:02
I was trying to access network drives using this opendir function. I read so many posts saying that it was almost impossible to access a network drive and finally, I found the answer; there are 2 steps to be followed to access a network drive with PHP either on the same machine or another machine.
But first of all, here's the error I was getting:
Warning: opendir(\\server\folder1\sub_folder) [function.opendir]: failed to open dir: No error in C:\wamp\www\PMOT\v0.1\REPORT_MENU\index.php on line 17
Firstly, one must make sure that the folder \\server\folder1\sub_folder can be accessed by a user, let's say USER_TEST with a password PASS_TEST. By setting properties to this folder, one can add this given user with the correct password (USER_TEST with PASS_TEST).
Secondly, the APACHE service must be set-up to take this user into account. If no user is specified, APACHE uses an anonymous user and this is where the problem/error message is coming from. One must go in control panel->administrative tools->services. One will see the list of services and must look for APACHE with Apache/2.X.X in the description. (For Wampserver, it will be called wampapache, and so on!) Right click on that and pop up the properties screen. In the tab LOG ON, there are 2 options: local system account and "this account" which will be a user specified account. This is where one must specify the USER_TEST and PASS_TEST.
Following these steps worked perfectly for me but if either the folder privileges or apache log on user is disabled, then I get the initial aforementioned error message.
Anyways, I hope this can help out someone!
Cheers!
Marc
27-Nov-2007 08:14
<?php
// images dir
$path = "../imp/images/";
//images them dir
$patha ="../imp/them";
$dh = opendir($path);
while ($file = readdir($dh))
if($file != "." && $file != ".." && $file != "Thumbs.db" && $file != "index.html" && $file != "index.php" ) {
{
echo"<a href='#top'>
<img border='0' src='$path/$file' onclick=\"window.open('$patha/$file', 'poppage$idd', 'toolbars=0, scrollbars=0, location=0, statusbars=0, menubars=0, resizable=1, $gg, left = 150, top = 50')\"; >
";
}
}
closedir($dh); // close dir
?>
when you need view images in folder
04-Oct-2007 12:04
How to find files in a directory, using regular expressions (case-sensitive or not)
<?php
clearstatcache();
$sourcepath = "C:/WINDOWS/TEMP";
// Replace \ by / and remove the final / if any
$root = ereg_replace( "/$", "", ereg_replace( "[\\]", "/", $sourcepath ));
// Search for text files
$results = m_find_in_dir( $root, ".*\.txt" );
if( false === $results ) {
echo "'{$sourcepath}' is not a valid directory\n";
} else {
print_r( $results );
}
/**
* Search for a file maching a regular expression
*
* @param string $root Root path
* @param string $pattern POSIX regular expression pattern
* @param boolean $recursive Set to true to walk the subdirectories recursively
* @param boolean $case_sensitive Set to true for case sensitive search
* @return array An array of string representing the path of the matching files, or false in case of error
*/
function m_find_in_dir( $root, $pattern, $recursive = true, $case_sensitive = false ) {
$result = array();
if( $case_sensitive ) {
if( false === m_find_in_dir__( $root, $pattern, $recursive, $result )) {
return false;
}
} else {
if( false === m_find_in_dir_i__( $root, $pattern, $recursive, $result )) {
return false;
}
}
return $result;
}
/**
* @access private
*/
function m_find_in_dir__( $root, $pattern, $recursive, &$result ) {
$dh = @opendir( $root );
if( false === $dh ) {
return false;
}
while( $file = readdir( $dh )) {
if( "." == $file || ".." == $file ){
continue;
}
if( false !== @ereg( $pattern, "{$root}/{$file}" )) {
$result[] = "{$root}/{$file}";
}
if( false !== $recursive && is_dir( "{$root}/{$file}" )) {
m_find_in_dir__( "{$root}/{$file}", $pattern, $recursive, $result );
}
}
closedir( $dh );
return true;
}
/**
* @access private
*/
function m_find_in_dir_i__( $root, $pattern, $recursive, &$result ) {
$dh = @opendir( $root );
if( false === $dh ) {
return false;
}
while( $file = readdir( $dh )) {
if( "." == $file || ".." == $file ){
continue;
}
if( false !== @eregi( $pattern, "{$root}/{$file}" )) {
$result[] = "{$root}/{$file}";
}
if( false !== $recursive && is_dir( "{$root}/{$file}" )) {
m_find_in_dir__( "{$root}/{$file}", $pattern, $recursive, $result );
}
}
closedir( $dh );
return true;
}
?>
04-Oct-2007 11:39
An other way to recursively walk a directory and it's content, applying a callback to each file.
Exemple: Update the last modification time of each file in a folder
<?php
clearstatcache();
$sourcepath = "C:/WINDOWS/TEMP";
// Replace \ by / and remove the final / if any
$root = ereg_replace( "/$", "", ereg_replace( "[\\]", "/", $sourcepath ));
// Touch all the files from the $root directory
if( false === m_walk_dir( $root, "m_touch_file", true )) {
echo "'{$root}' is not a valid directory\n";
}
// Walk a directory recursivelly, and apply a callback on each file
function m_walk_dir( $root, $callback, $recursive = true ) {
$dh = @opendir( $root );
if( false === $dh ) {
return false;
}
while( $file = readdir( $dh )) {
if( "." == $file || ".." == $file ){
continue;
}
call_user_func( $callback, "{$root}/{$file}" );
if( false !== $recursive && is_dir( "{$root}/{$file}" )) {
m_walk_dir( "{$root}/{$file}", $callback, $recursive );
}
}
closedir( $dh );
return true;
}
// if the path indicates a file, run touch() on it
function m_touch_file( $path ) {
echo $path . "\n";
if( !is_dir( $path )) {
touch( $path );
}
}
?>
09-Sep-2007 12:03
A simple function to count all the files and/or dirs inside a dir.
With optional extention when counting files.
Index of /
Some text file.txt
files/
num_files.phps
test.php
<?php
function num_files($dir, $type, $ext="")
{
// type 1: files only
// type 2: direcories only
// type 3: files and directories added
// type 4: files and directories separated with a space
if (!isset($dir) OR empty($dir))
{
echo '<b>Syntax error:</b> $dir value empty.';
exit;
}
$num_files = 0;
$num_dirs = 0;
switch($type)
{
case 1: // count only files, not dirs
if ($dir = @opendir($dir))
{
while (($file = readdir($dir)) !== false)
{
if(is_file($file) AND $file != "." AND $file != "..")
{
if (isset($ext) AND !empty($ext))
{
$extension = end(explode(".", $file));
if ($ext == $extension)
{
$num_files++;
}
}
else
{
$num_files++;
}
}
}
closedir($dir);
$total = $num_files;
}
break;
case 2: // count only dirs, not files
if ($dir = @opendir($dir))
{
while (($file = readdir($dir)) !== false)
{
if(is_dir($file) AND $file != "." AND $file != "..")
{
$num_dirs++;
}
}
closedir($dir);
$total = $num_dirs;
}
break;
case 3: // count files PLUS dirs in once variable
if ($dir = @opendir($dir))
{
while (($file = readdir($dir)) !== false)
{
if(is_dir($file) OR is_dir($file))
{
if ($file != "." AND $file != "..")
{
$num_files++;
}
}
}
closedir($dir);
$total = $num_files;
}
break;
case 4: // count files AND dirs separately
if ($dir = @opendir($dir))
{
while (($file = readdir($dir)) !== false)
{
if(is_file($file) AND $file != "." AND $file != "..")
{
$num_files++;
}
if(is_dir($file) AND $file != "." AND $file != "..")
{
$num_dirs++;
}
}
closedir($dir);
$total = $num_files." ".$num_dirs;
}
break;
default:
echo '<b>Syntax error:</b> $type value empty.';
break;
}
return $total;
}
echo num_files($_SERVER['DOCUMENT_ROOT'], 1, "php"). " file(s) met php extention<br /> ";
echo num_files($_SERVER['DOCUMENT_ROOT'], 1). " file(s)<br />";
echo num_files($_SERVER['DOCUMENT_ROOT'], 2). " dir(s)<br />";
echo num_files($_SERVER['DOCUMENT_ROOT'], 3). " file(s) + dir(s)<br />";
$nummers = explode(" ", num_files($_SERVER['DOCUMENT_ROOT'], 4));
echo reset($nummers) ." file(s) en ". end($nummers) ." dir(s)";
?>
will output:
1 file(s) with php extention
3 file(s)
1 dir(s)
1 file(s) + dir(s)
3 file(s) en 1 dir(s)
13-May-2007 06:00
I sometimes find this useful. Hope you will too.
<?php
//list_by_ext: returns an array containing an alphabetic list of files in the specified directory ($path) with a file extension that matches $extension
function list_by_ext($extension, $path){
$list = array(); //initialise a variable
$dir_handle = @opendir($path) or die("Unable to open $path"); //attempt to open path
while($file = readdir($dir_handle)){ //loop through all the files in the path
if($file == "." || $file == ".."){continue;} //ignore these
$filename = explode(".",$file); //seperate filename from extenstion
$cnt = count($filename); $cnt--; $ext = $filename[$cnt]; //as above
if(strtolower($ext) == strtolower($extension)){ //if the extension of the file matches the extension we are looking for...
array_push($list, $file); //...then stick it onto the end of the list array
}
}
if($list[0]){ //...if matches were found...
return $list; //...return the array
} else {//otherwise...
return false;
}
}
//example usage
if($win32_exectuables = list_by_ext("exe", "C:\WINDOWS")){
var_dump($win32_exectuables);
} else {
echo "No windows executables found :(\n";
}
?>
11-May-2007 07:59
# simple directory walk with callback function
<?php
function callbackDir($dir)
{
# do whatever you want here
echo "$dir\n";
}
function walkDir($dir,$fx)
{
$arStack = array();
$fx($dir);
if( ($dh=opendir($dir)) )
{ while( ($file=readdir($dh))!==false )
{ if( $file=='.' || $file=='..' ) continue;
if( is_dir("$dir/$file") )
{ if( !in_array("$dir/$file",$arStack) ) $arStack[]="$dir/$file";
}
}
closedir($dh);
}
if( count($arStack) )
{ foreach( $arStack as $subdir )
{ walkDir($subdir,$fx);
}
}
}
walkDir($root,callBackDir);
?>
07-May-2007 05:04
In reponse to Tozeiler. Nice short directory dump. However, that displays the "." and "..". This removes those. It also makes an ordered list in case I needed to be on the phone while looking at the page. Easy to call out.
<?php
$path = "your path";
$dh = opendir($path);
$i=1;
while (($file = readdir($dh)) !== false) {
if($file != "." && $file != "..") {
echo "$i. <a href='$path/$file'>$file</a><br />";
$i++;
}
}
closedir($dh);
?>
02-May-2007 11:46
Using Apache 2.2.4 with PHP and MySQL I was trying to connect to a Novell Netware drive using opendir("R:/") where R: was pointing to a Netware resource on another server. The error returned was
Warning: opendir(R:/) [function.opendir]: failed to open dir: No such file or directory in path/to/my/phpfile/containing/opendir on line 34.
Basically it is a problem with Netware rights and users and how the apache service was trying to connect to the resource.
To get everything working as expected in the end we set up a Windows user account eg: webhost with the same password as a Netware account with username webhost, set the Netware account to have rights to the resource R:/ (we just used admin rights), and set the apache service to run as the webhost user using the username password combo.
Hope this helps someone else out.
14-Apr-2007 10:13
This is a script that prints all the file and directory names on your server no matter where the script file is located
(could take a lot of time to execute, if you have a lot of directories and files...)
Hope someone finds it useful...
<?php
print $_SERVER['DOCUMENT_ROOT'] . "<br />";
$root = @opendir($_SERVER['DOCUMENT_ROOT']);
$dirs = array();
while($file = readdir($root)){
print $file;
if((is_dir($file) || !stristr($file, ".")) && $file!="." && $file!=".."){
$dirs[] = ($_SERVER['DOCUMENT_ROOT'] . "/" . $file);
print "(adding directory)";
}
print "<br />";
}
closedir($root);
print "<br /><br />Inside Dirs: (" . (count($dirs)) . ")<br />";
$i = 0;
while($i < count($dirs)){
$d = @opendir($dirs[$i]);
print "<br /><br />Directory: " . $dirs[$i] . "<br />";
while($f = readdir($d)){
print $f;
if((is_dir($f) || !stristr($f, ".")) && $f!="." && $f!=".."){
$dirs[] = $dirs[$i] . "/" . $f;
print "(adding directory)";
}
print "<br />";
}
closedir($d);
$i = $i + 1;
}
$i = $i - 1;
?>
08-Feb-2007 08:36
Here is a snippet to create a site map of all html files in a folder:
<?php
// read all html file in the current directory
if ($dh = opendir('./')) {
$files = array();
while (($file = readdir($dh)) !== false) {
if (substr($file, strlen($file) - 5) == '.html') {
array_push($files, $file);
}
}
closedir($dh);
}
// Sort the files and display
sort($files);
echo "<ul>\n";
foreach ($files as $file) {
$title = Title($file);
echo "<li><a href=\"$file\" title=\"$title\">$title</a></li>\n";
}
echo "</ul>\n";
// Function to get a human readable title from the filename
function Title($filename) {
$title = substr($filename, 0, strlen($filename) - 5);
$title = str_replace('-', ' ', $title);
$title = ucwords($title);
return $title;
}
?>
21-Jan-2007 12:30
Here's a function that will recrusively turn a directory into a hash of directory hashes and file arrays, automatically ignoring "dot" files.
<?php
function hashify_directory($topdir, &$list, $ignoredDirectories=array()) {
if (is_dir($topdir)) {
if ($dh = opendir($topdir)) {
while (($file = readdir($dh)) !== false) {
if (!(array_search($file,$ignoredDirectories) > -1) && preg_match('/^\./', $file) == 0) {
if (is_dir("$topdir$file")) {
if(!isset($list[$file])) {
$list[$file] = array();
}
ksort($list);
hashify_directory("$topdir$file/", $list[$file]);
} else {
array_push($list, $file);
}
}
}
closedir($dh);
}
}
}
?>
e.g.
<?php
$public_html["StudentFiles"] = array();
hashify_directory("StudentFiles/", $public_html["StudentFiles"]);
?>
on the directory structure:
./StudentFiles/tutorial_01/case1/file1.html
./StudentFiles/tutorial_01/case1/file2.html
./StudentFiles/tutorial_02/case1/file1.html
./StudentFiles/tutorial_02/case2/file2.html
./StudentFiles/tutorial_03/case1/file2.html
etc...
becomes:
<?php
print_r($public_html);
/*
outputs:
array(
"StudentFiles" => array (
"tutorial_01" => array (
"case1" => array( "file1.html", "file2.html")
),
"tutorial_02" => array (
"case1" => array( "file1.html"),
"case2" => array( "file2.html")
),
"tutorial_03" => array (
"case1" => array( "file2.html")
)
)
)
*/
?>
I'm using it to create a tree view of a directory.
13-Dec-2006 01:40
An issue that I ran into is that opendir() could care less if you've got server authentication set on sub directories and so any such authentication is bypassed completely when accesses in this way. I did solve it for my application of a pretty file manager, by redirecting to all sub directories thusly:
$fdir = "./subdirectory_I_want_to_visit/";
if ($fdir != './') { //basically where we are or the parent
//redirect the browser to force authentication check on any subdirectories
header("Location: http://my.domain.com".dirname($_SERVER["PHP_SELF"]).substr($fdir,2));
exit;
} else {
$dir = opendir($fdir);
}
01-Nov-2006 09:49
John & I have edited the code posted by hendrik dot wermer at gmx dot de on 07-Feb-2005 06:06
This Code now allows for downloads form sub directories. We also used CSS to make the page's look customizable.
You can view the example at: http://www.asterikast.com/code/dirlist.txt
23-Oct-2006 09:55
In response to previous post,
you can use realpath() to fix the '/../../../' problem.
26-Jul-2006 03:10
Pointing on the previous post, I'd like to say the following.
You can use opendir on all valid (existant and reachable) folders.
This counts not only for windows but also for linux.
Under linux, you can also read root folders etc.
To avoid access to non-public data, you should check the given parameter for opendir before executing opendir.
Let's say you have this:
/home/users/mrsmith/
/home/users/mrsmith/info.txt
/home/users/mrsmith/test/photo.jpg
/home/users/mradmin/private.txt
Now you don't want mrsmith to access mradmin's folders/files.
In that case you could/should define the path where the data MUST be inside.
Attention:
Don't check the data with substr though, it's not a secure solution.
Exploit example: /home/users/mrsmith/../mradmin/
Exploit example2: /home/users/mrsmith/../../../../../../../../../../../../../dev/
I'd do a case sensitive regex match.
So after the first folder there may not be a subfolder named ".." because that would jump one folder back.
I hope this isn't too offtopic or so but I think it's important to think of that when creating file systems.
13-May-2006 05:04
Hello,
A friend of mine is running a webhost, I think i found a security leak with this script:
<?php
function select_files($dir, $label = "", $select_name, $curr_val = "", $char_length = 30) {
$teller = 0;
if ($handle = opendir($dir)) {
$mydir = ($label != "") ? "<label for=\"".$select_name."\">".$label."</label>\n" : "";
$mydir .= "<select name=\"".$select_name."\">\n";
$curr_val = (isset($_REQUEST[$select_name])) ? $_REQUEST[$select_name] : $curr_val;
$mydir .= ($curr_val == "") ? " <option value=\"\" selected>...\n" : "<option value=\"\">...\n";
while (false !== ($file = readdir($handle))) {
$files[] = $file;
}
closedir($handle);
sort($files);
foreach ($files as $val) {
if (is_file($dir.$val)) { // show only real files (ver. 1.01)
$mydir .= " <option value=\"".$val."\"";
$mydir .= ($val == $curr_val) ? " selected>" : ">";
$mydir .= (strlen($val) > $char_length) ? substr($val, 0, $char_length)."...\n" : $val."\n";
$teller++;
}
}
$mydir .= "</select>";
}
if ($teller == 0) {
$mydir = "No files!";
} else {
return $mydir;
}
}
echo select_files("C:/winnt/", "", "", "", "60");
?>
Now i can see hist files in his windows dir. Is this a leak? and is it fixable? I'll report this as bug too!
Tim2005
15-Apr-2006 01:34
"opendir" said:
------------------------------------------------------------------
23-Jan-2006 08:04
I Just wanted a directory list and a clickable link to download the files
<snip>
------
<?
echo ("<h1>Directory Overzicht:</h1>");
function getFiles($path) {
<snip complicated function contents>
------------------------------------------------------------------
Here's a more straightforward way to linkify $path/files:
<?php
echo "<h1>Directory Overzicht:</h1>";
$dh = opendir($path);
while (($file = readdir($dh)) !== false) {
echo "<a href='$path/$file'>$file</a><br />";
}
closedir($dh);
?>
I Just wanted a directory list and a clickable link to download the files because my plesk server does not give me this function. I edited the script a little bit.
Many thanks from a script-noob
------
<?
echo ("<h1>Directory Overzicht:</h1>");
function getFiles($path) {
//Function takes a path, and returns a numerically indexed array of associative arrays containing file information,
//sorted by the file name (case insensitive). If two files are identical when compared without case, they will sort
//relative to each other in the order presented by readdir()
$files = array();
$fileNames = array();
$i = 0;
if (is_dir($path)) {
if ($dh = opendir($path)) {
while (($file = readdir($dh)) !== false) {
if ($file == "." || $file == "..") continue;
$fullpath = $path . "/" . $file;
$fkey = strtolower($file);
while (array_key_exists($fkey,$fileNames)) $fkey .= " ";
$a = stat($fullpath);
$files[$fkey]['size'] = $a['size'];
if ($a['size'] == 0) $files[$fkey]['sizetext'] = "-";
else if ($a['size'] > 1024) $files[$fkey]['sizetext'] = (ceil($a['size']/1024*100)/100) . " K";
else if ($a['size'] > 1024*1024) $files[$fkey]['sizetext'] = (ceil($a['size']/(1024*1024)*100)/100) . " Mb";
else $files[$fkey]['sizetext'] = $a['size'] . " bytes";
$files[$fkey]['name'] = $file;
$files[$fkey]['type'] = filetype($fullpath);
$fileNames[$i++] = $fkey;
}
closedir($dh);
} else die ("Cannot open directory: $path");
} else die ("Path is not a directory: $path");
sort($fileNames,SORT_STRING);
$sortedFiles = array();
$i = 0;
foreach($fileNames as $f) $sortedFiles[$i++] = $files[$f];
return $sortedFiles;
}
$files = getFiles("./");
foreach ($files as $file) print " <b><a href=\"$file[name]\">$file[name]</a></b><br>\n";
?>
28-Dec-2005 08:26
In my previous post I ran into a problem with the "global" definition of $directorylist. If I called the function more than once on the same page it would combine the file lists. I looked at Lasse Dalegaard's example and used the following solution.
remove global definition
global $directorylist;
REPLACE
<?
if ((($maxlevel) == "all") or ($maxlevel > $level)) {
filelist($startdir . $file . "/", $searchSubdirs, $directoriesonly, $maxlevel, $level + 1);
}
?>
WITH
<?
if ((($maxlevel) == "all") or ($maxlevel > $level)) {
$list2 = filelist($startdir . $file . "/", $searchSubdirs, $directoriesonly, $maxlevel, $level + 1);
if(is_array($list2)) {
$directorylist = array_merge($directorylist, $list2);
}
}
?>
27-Dec-2005 07:04
<?php
/* The below function will list all folders and files within a directory
It is a recursive function that uses a global array. The global array was the easiest
way for me to work with an array in a recursive function
*This function has no limit on the number of levels down you can search.
*The array structure was one that worked for me.
ARGUMENTS:
$startdir => specify the directory to start from; format: must end in a "/"
$searchSubdirs => True/false; True if you want to search subdirectories
$directoriesonly => True/false; True if you want to only return directories
$maxlevel => "all" or a number; specifes the number of directories down that you want to search
$level => integer; directory level that the function is currently searching
*/
function filelist ($startdir="./", $searchSubdirs=1, $directoriesonly=0, $maxlevel="all", $level=1) {
//list the directory/file names that you want to ignore
$ignoredDirectory[] = ".";
$ignoredDirectory[] = "..";
$ignoredDirectory[] = "_vti_cnf";
global $directorylist; //initialize global array
if (is_dir($startdir)) {
if ($dh = opendir($startdir)) {
while (($file = readdir($dh)) !== false) {
if (!(array_search($file,$ignoredDirectory) > -1)) {
if (filetype($startdir . $file) == "dir") {
//build your directory array however you choose;
//add other file details that you want.
$directorylist[$startdir . $file]['level'] = $level;
$directorylist[$startdir . $file]['dir'] = 1;
$directorylist[$startdir . $file]['name'] = $file;
$directorylist[$startdir . $file]['path'] = $startdir;
if ($searchSubdirs) {
if ((($maxlevel) == "all") or ($maxlevel > $level)) {
filelist($startdir . $file . "/", $searchSubdirs, $directoriesonly, $maxlevel, $level + 1);
}
}
} else {
if (!$directoriesonly) {
//if you want to include files; build your file array
//however you choose; add other file details that you want.
$directorylist[$startdir . $file]['level'] = $level;
$directorylist[$startdir . $file]['dir'] = 0;
$directorylist[$startdir . $file]['name'] = $file;
$directorylist[$startdir . $file]['path'] = $startdir;
}}}}
closedir($dh);
}}
return($directorylist);
}
$files = filelist("./",1,1); // call the function
foreach ($files as $list) {//print array
echo "Directory: " . $list['dir'] . " => Level: " . $list['level'] . " => Name: " . $list['name'] . " => Path: " . $list['path'] ."<br>";
}?>
10-Dec-2005 11:16
I wrote a function to recursively delete files from a starting directory. I had to do this because my server doesn't allow me to delete files that apache writes because I don't have permissions, so... I let apache do the work.
<?php
$dir = "/path/to/base/dir";
recursive_delete($dir);
function recursive_delete( $dir )
{
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false ) {
if( $file != "." && $file != ".." )
{
if( is_dir( $dir . $file ) )
{
echo "Entering Directory: $dir$file<br/>";
recursive_delete( $dir . $file . "/" );
echo "Removing Directory: $dir$file<br/><br/>";
rmdir( $dir . $file );
}
else
{
echo "Deleting file: $dir$file<br/>";
unlink( $dir . $file );
}
}
}
closedir($dh);
}
}
}
?>
30-Nov-2005 09:41
oryan's example is still sub-optimal, even if people using it never ever substitute a variable for directory.
Just use PHP's glob() function, which will be faster and more efficient anyway since it doesn't have to launch a shell and run the ls program (that's what the shell_exec does).
$result = glob("directory/*");
01-Nov-2005 03:19
There might be a bit of truth to that. If, by chance, the webmaster made a form saying "type a random directory name here" and used that in the function, there'd be a problem. So let's eliminate the 'function' part
$files=shell_exec("ls directory");
$result=explode("\n",$files);
'$result' will now be an array of the directory files. You can use variables in the shell_exec command, but don't use anything that could be user-sent.
31-Oct-2005 07:54
The example given by oryan at zareste dot com may also be a "simpler faster way" of creating security holes in your code. The function listed above prevents risking execution of abitrary shell commands listed after a semicolon (;) in your directory name.
Example: $directory = '.;rm -rf /';
Result: List this directory, erase contents of filesystem.
30-Oct-2005 05:33
There's a simpler faster way to get a whole directory if you're using PHP 4. This function uses shell_exec - http://us3.php.net/shell_exec - and assumes you're using Unix/Linux and have shell access -
function dir($directory){
$files=shell_exec("ls ".$directory);
return explode("\n",$files);
}
This returns an array with all the files.
This way, you can use modifiers like -t, which shows files in order of modification time ($files=shell_exec("ls -t ".$directory);). Enough tweaking and you can use it on Windows, though I can't say how since I don't have a Windows server to try it on
07-Oct-2005 09:56
//this is a function I wrote to sort out the contents of the directory date wise for display.
$content_array = array();
//set current working directory
$dirname = "C:\temp";
//Load Directory Into Array
$handle=opendir($dirname);
$i=0;
while ($file = readdir($handle))
if ($file != "." && $file != "..")
{
$content_array[$i][0] = $file;
$content_array[$i][1] = date ("Y m d", filemtime($dirname."/".$file));
$i++;
}
//close the directory handle
closedir($handle);
//these lines sort the contents of the directory by the date
foreach($content_array as $res)
$sortAux[] = $res[1];
array_multisort($sortAux, SORT_ASC, $content_array);
This function sorts files by name as strings, but without regard to case. It also does some handy string formatting of the file size information.
<?
function getFiles($path) {
//Function takes a path, and returns a numerically indexed array of associative arrays containing file information,
//sorted by the file name (case insensitive). If two files are identical when compared without case, they will sort
//relative to each other in the order presented by readdir()
$files = array();
$fileNames = array();
$i = 0;
if (is_dir($path)) {
if ($dh = opendir($path)) {
while (($file = readdir($dh)) !== false) {
if ($file == "." || $file == "..") continue;
$fullpath = $path . "/" . $file;
$fkey = strtolower($file);
while (array_key_exists($fkey,$fileNames)) $fkey .= " ";
$a = stat($fullpath);
$files[$fkey]['size'] = $a['size'];
if ($a['size'] == 0) $files[$fkey]['sizetext'] = "-";
else if ($a['size'] > 1024) $files[$fkey]['sizetext'] = (ceil($a['size']/1024*100)/100) . " K";
else if ($a['size'] > 1024*1024) $files[$fkey]['sizetext'] = (ceil($a['size']/(1024*1024)*100)/100) . " Mb";
else $files[$fkey]['sizetext'] = $a['size'] . " bytes";
$files[$fkey]['name'] = $file;
$files[$fkey]['type'] = filetype($fullpath);
$fileNames[$i++] = $fkey;
}
closedir($dh);
} else die ("Cannot open directory: $path");
} else die ("Path is not a directory: $path");
sort($fileNames,SORT_STRING);
$sortedFiles = array();
$i = 0;
foreach($fileNames as $f) $sortedFiles[$i++] = $files[$f];
return $sortedFiles;
}
$files = getFiles("C:");
foreach ($files as $file) print "$file[name]<br>\n";
?>
21-May-2005 12:25
I made a function for finding all files in a specified directory and all subdirectories. It can be quite usefull when searching in alot of files in alot subdirectories. The function returns an array with the path of all the files found.
<?
function getFiles($directory) {
// Try to open the directory
if($dir = opendir($directory)) {
// Create an array for all files found
$tmp = Array();
// Add the files
while($file = readdir($dir)) {
// Make sure the file exists
if($file != "." && $file != ".." && $file[0] != '.') {
// If it's a directiry, list all files within it
if(is_dir($directory . "/" . $file)) {
$tmp2 = getFiles($directory . "/" . $file);
if(is_array($tmp2)) {
$tmp = array_merge($tmp, $tmp2);
}
} else {
array_push($tmp, $directory . "/" . $file);
&n