|
readdir
Read entry from directory handle
(PHP 4, PHP 5)
Example 508. List all files in a directory
Please note the fashion in which readdir()'s
return value is checked in the examples below. We are explicitly
testing whether the return value is identical to (equal to and of
the same type as--see Comparison
Operators for more information) <?php Example 509. List all files in the current directory and strip out . and ..<?php Related Examples ( Source code ) » readdir Examples ( Source code ) » Listing the Contents of a Directory with readdir() Examples ( Source code ) » Calculate the size for a directory Examples ( Source code ) » readdir Examples ( Source code ) » Print all files under a directory Examples ( Source code ) » Read the content from a directory Examples ( Source code ) » Reading Contents from a Directory Examples ( Source code ) » Define recursive function to delete directories Examples ( Source code ) » Create a swf slideshow Code Examples / Notes » readdirskysama
Yet another view files by extension /* NOTE: * /a-d = do not include directories * /b = show files in bare mode ( no dates or filesize ) */ <?php $dir = '.\\img\\'; // reminder: escape your slashes $filetype = "*.png"; $filelist = shell_exec( "dir {$dir}{$filetype} /a-d /b" ); $file_arr = explode( "\n", $filelist ); array_pop( $file_arr ); // last line is always blank print_r( $file_arr ); ?> minisprinter
The following code is a bit nasty, it can be used to remove all files generated by apache. You're not a root user on a system, but you sometimes need to remove all files generated by apache in a certain directory. You may use this after replacing 'bbs' at the bottom with 'directory' you want. It tries to remove all files in a directory, but it can't unless it has an ownership. it doesn't check the ownership or permission. <?php function remove($dirname = '.') { if (is_dir($dirname)) { echo "$dirname is a directory.<br />"; if ($handle = @opendir($dirname)) { while (($file = readdir($handle)) !== false) { if ($file != "." && $file != "..") { echo "$file<br />"; $fullpath = $dirname . '/' . $file; if (is_dir($fullpath)) { remove($fullpath); @rmdir($fullpath); } else { @unlink($fullpath); } } } closedir($handle); } } } remove('bbs'); ?> moehbass
Sorry, In my last post, if you only want to list files with certain extensions, then see how many letters this extension is, add one to it, and subtract it from the strlen of the file name. Review script below for details. fridh
Someone mentioned the infinite recursion when a symbolic link was found... tip: is_link() is a nice function :) kermodebear
Several people here have been writing code snippets that will get a list of files with a certain extension. There is a much easier way to do this: use glob. <?php $a_fileList = glob('/path/to/directory/*.jpg'); foreach ($a_fileList as $file) { ... } ?> http://www.php.net/glob/ moehbass
Responding to: johan dot mickelin at gmail dot com 31-May-2007 07:52 ------------------------------------------------------- If you want to list only a certain filetype, this case only jpg and gif files in an image directory $dir = opendir ("../images"); while (false !== ($file = readdir($dir))) { if (strpos($file, '.gif',1)||strpos($file, '.jpg',1) ) { echo "$file <br />"; } } ----------------------------------------------------------------- This function would also echo files that have .gif or .jpg in their names such as myFile.gif.php (I don't know why I'd name a file like that, but I am just making a point, that's all folks!) Perhaps a more exact way is to do the following: ... while (false !== ($file = readdir($dir))) { $lenOfFileName = strlen($file); $extOffsetPos = $lenOfFileName - 5; if (strpos($file, '.gif', $extOffsetPos) || strpos($file, '.jpg',$extOffsetPos) ) { echo "$file <br />"; } ... If your extensions are more than three letters, then increase the 5 to 6 (e.g. aspx) to 7 (e.g. php51) or whatever. adrong spatam dealslab.com
Passing $arFiles by reference, the getFiles function will return all jpeg, gif, and png images in a given directory and its subdirectories in a two dimensional array. <?php $startPath='.'; getFiles($startPath, &$arFiles); sort($arFiles); //produces desired result in PHP v4.4.4; other versions may not. //$arFiles[INDEX][0] the full directory in which the file is found //$arFiles[INDEX][1] the filename. //path and filename = $arFiles[INDEX][0].'/'.$arFiles[INDEX][1] foreach($arFiles as $val) //the line below will display the picture. echo '<img src="'.str_replace('.', '', $val[0]).'/'.urlencode($val[1]).'"> '; //the commented line below will show the path to the picture. //echo $val[0].'/'.urlencode($val[1]).' '; //I use another PHP script to resize pictures to a common size on the fly, //then use a more complicated version of this script to place resized images into an HTML table //echo '<img src=resize.php?pic="'.str_replace('.', '', $val[0]).'/'.urlencode($val[1]).'"> '; function getFiles($dir, $arFiles) { $imgFiles=opendir($dir); while($aFile=readdir($imgFiles) ) if(is_dir($dir.'/'.$aFile) && ereg('[^\.]', $aFile)) getFiles($dir.'/'.$aFile, &$arFiles); else if(eregi('.*\.jpg|.*\.jpeg|.*\.gif|.*\.png', $aFile)) $arFiles[]=array($dir, $aFile); } ?> phpwizard-at-pech-dot-cz
It should work, but it'll be better to read section 13.1.3 Cache-control Mechanisms of RFC 2616 available at http://rfc.net/rfc2616.html before you start with confusing proxies on the way from you and the client. Reading it is the best way to learn how proxies work, what should you do to modify cache-related headers of your documents and what you should never do again. :-) And of course not reading RFCs is the best way to never learn how internet works and the best way to behave like Microsoft corp. Have a nice day! Jirka Pech johan dot mickelin
If you want to list only a certain filetype, this case only jpg and gif files in an image directory $dir = opendir ("../images"); while (false !== ($file = readdir($dir))) { if (strpos($file, '.gif',1)||strpos($file, '.jpg',1) ) { echo "$file <br />"; } } nullbyte
I haven't tested this yet, but it seems like it'll do just fine if you need files of a certain extension: $dh = opendir($options['inputDir']); $files = array(); while (($filename = readdir($dh)) !== false) { if (substr($filename, strrpos($filename, '.')) == $options['inputExt']) { $files[] = $filename; } } closedir($dh); qube#php@efnet
Here is an updated version of preg_find() [which has been linked from the glob() man page for years] - this function should provide most of what you want back from reading files, directories, different sorting methods, recursion, and perhaps most powerful of all the ability to pattern match with a PCRE regex. You can get preg_find here: http://www.pgregg.com/projects/php/preg_find/preg_find.php.txt or if you prefer colourful .phps format: http://www.pgregg.com/projects/php/preg_find/preg_find.phps or scoll down to the end of this note. I wrote several examples on how to use it on my blog at: http://www.pgregg.com/forums/viewtopic.php?tid=73 simple glob() type replacement: $files = preg_find('/./', $dir); recursive? $files = preg_find('/./', $dir, PREG_FIND_RECURSIVE); pattern match? find all .php files: $files = preg_find('/\.php$/D', $dir, PREG_FIND_RECURSIVE); sorted alphabetically? $files = preg_find('/\.php$/D', $dir, PREG_FIND_RECURSIVE|PREG_FIND_SORTKEYS); sorted in by filesize, in descending order? $files = preg_find('/./', $dir, PREG_FIND_RECURSIVE|PREG_FIND_RETURNASSOC |PREG_FIND_SORTFILESIZE|PREG_FIND_SORTDESC); $files=array_keys($files); sorted by date modified? $files = preg_find('/./', $dir, PREG_FIND_RECURSIVE|PREG_FIND_RETURNASSOC |PREG_FIND_SORTMODIFIED); $files=array_keys($files); Ok, the PHP note says my note is too long, so please click on one of the above links to get it. schursin
code: <?php function permission($filename) { $perms = fileperms($filename); if (($perms & 0xC000) == 0xC000) { $info = 's'; } elseif (($perms & 0xA000) == 0xA000) { $info = 'l'; } elseif (($perms & 0x8000) == 0x8000) { $info = '-'; } elseif (($perms & 0x6000) == 0x6000) { $info = 'b'; } elseif (($perms & 0x4000) == 0x4000) { $info = 'd'; } elseif (($perms & 0x2000) == 0x2000) { $info = 'c'; } elseif (($perms & 0x1000) == 0x1000) { $info = 'p'; } else { $info = 'u'; } // Ð²Ð»Ð°Ð´ÐµÐ»ÐµÑ $info .= (($perms & 0x0100) ? 'r' : '-'); $info .= (($perms & 0x0080) ? 'w' : '-'); $info .= (($perms & 0x0040) ? (($perms & 0x0800) ? 's' : 'x' ) : (($perms & 0x0800) ? 'S' : '-')); // гÑÑппа $info .= (($perms & 0x0020) ? 'r' : '-'); $info .= (($perms & 0x0010) ? 'w' : '-'); $info .= (($perms & 0x0008) ? (($perms & 0x0400) ? 's' : 'x' ) : (($perms & 0x0400) ? 'S' : '-')); // вÑе $info .= (($perms & 0x0004) ? 'r' : '-'); $info .= (($perms & 0x0002) ? 'w' : '-'); $info .= (($perms & 0x0001) ? (($perms & 0x0200) ? 't' : 'x' ) : (($perms & 0x0200) ? 'T' : '-')); return $info; } function dir_list($dir) { if ($dir[strlen($dir)-1] != '/') $dir .= '/'; if (!is_dir($dir)) return array(); $dir_handle = opendir($dir); $dir_objects = array(); while ($object = readdir($dir_handle)) if (!in_array($object, array('.','..'))) { $filename = $dir . $object; $file_object = array( 'name' => $object, 'size' => filesize($filename), 'perm' => permission($filename), 'type' => filetype($filename), 'time' => date("d F Y H:i:s", filemtime($filename)) ); $dir_objects[] = $file_object; } return $dir_objects; } ?> call: <?php print_r(dir_list('/path/to/you/dir/')); ?> output sample: Array ( [0] => Array ( [name] => api [size] => 0 [perm] => drwxrwxrwx [type] => dir [time] => 28 May 2007 01:55:02 ) [1] => Array ( [name] => classes [size] => 0 [perm] => drwxrwxrwx [type] => dir [time] => 26 May 2007 00:56:44 ) [2] => Array ( [name] => config.inc.php [size] => 143 [perm] => -rw-rw-rw- [type] => file [time] => 26 May 2007 13:13:19 ) [3] => Array ( [name] => index.php [size] => 131 [perm] => -rw-rw-rw- [type] => file [time] => 26 May 2007 22:15:18 ) [4] => Array ( [name] => modules [size] => 0 [perm] => drwxrwxrwx [type] => dir [time] => 28 May 2007 00:47:40 ) [5] => Array ( [name] => temp [size] => 0 [perm] => drwxrwxrwx [type] => dir [time] => 28 May 2007 04:49:33 ) ) qube#php@efnet
<?php // Sample function to recursively return all files within a directory. // http://www.pgregg.com/projects/php/code/recursive_readdir.phps Function listdir($start_dir='.') { $files = array(); if (is_dir($start_dir)) { $fh = opendir($start_dir); while (($file = readdir($fh)) !== false) { # loop through the files, skipping . and .., and recursing if necessary if (strcmp($file, '.')==0 || strcmp($file, '..')==0) continue; $filepath = $start_dir . '/' . $file; if ( is_dir($filepath) ) $files = array_merge($files, listdir($filepath)); else array_push($files, $filepath); } closedir($fh); } else { # false if the function was called with an invalid non-directory argument $files = false; } return $files; } $files = listdir('.'); print_r($files); ?> |