|
glob
Find pathnames matching a pattern
(PHP 4 >= 4.3.0, PHP 5)
Example 652. Convenient way how glob() can replace opendir() and friends.<?php The above example will output something similar to: funclist.txt size 44686 Related Examples ( Source code ) » glob Examples ( Source code ) » Form Data Validation With Error Count Examples ( Source code ) » Turning an XML Document into an Array Examples ( Source code ) » Using a Default Handler Examples ( Source code ) » Generating Tables from XML Examples ( Source code ) » Transforming XML into Basic HTML Examples ( Source code ) » File Upload Global Variables Examples ( Source code ) » the global statement is used Examples ( Source code ) » Accessing Global Variables with the global Statement Examples ( Source code ) » Using the global Statement to Remember the Value of a Variable Between Function Calls Examples ( Source code ) » Set new value into GLOBALS values Examples ( Source code ) » Looping Through the $GLOBALS Array Examples ( Source code ) » A Function to Build Query Strings Examples ( Source code ) » Animated Talking Captcha php class Examples ( Source code ) » Search the Web using Google API Examples ( Source code ) » E-mail address validation class Code Examples / Notes » globdman
Whilst on Windows, a path starting with a slash resolves OK for most file functions - but NOT glob. If the server is LAUNCHED (or chdir()ed) to W:, then file_exists("/temp/test.txt") returns true for the file "W:/temp/test.txt". But glob("/temp/*.txt") FAILS to find it! A solution (if you want to avoid getting drive letters into your code) is to chdir() first, then just look for the file. <?php $glob="/temp/*.txt"; chdir(dirname($glob)); // getcwd() is now actually "W:\temp" or whatever foreach (glob(basename($glob)) as $filename) { $filepath = dirname($glob)."/".$filename; // must re-attach full path echo "$filepath size " . filesize($filepath) . "\n"; } ?> Note also, glob() IS case sensitive although most other file funcs on Windows are not. josh
To: martinlarsen at bigfoot dot com (14-Jun-2007 01:13) [quote] glob() does not work if the path contains brackets "[" and "]". For example, this will make it fail: $files = glob("[myfolder]/*.txt"); No error is returned, just an empty array! [/quote] Hi there, if you backslash the brackets, it should work. Try: $files = glob("\[myfolder\]/*.txt"); Hope this helps. x_terminat_or_3
This is a replacement for glob on servers that are running a php version < 4.3 It supports * and ? jokers, and stacking of parameters with ; So you can do <? $results=glob('/home/user/*.txt;*.doc') ?> And it will return an array of matched files. As is the behaviour of the built-in glob function, this one will also return boolean false if no matches are found, and will use the current working directory if none is specified. <?php if(!(function_exists('glob'))) {function glob($pattern) {#get pathname (everything up until the last / or \) $path=$output=null; if(PHP_OS=='WIN32') $slash='\\'; else $slash='/'; $lastpos=strrpos($pattern,$slash); if(!($lastpos===false)) {$path=substr($pattern,0,-$lastpos-1); #negative length means take from the right $pattern=substr($pattern,$lastpos); } else {#no dir info, use current dir $path=getcwd(); } $handle=@ opendir($path); if($handle===false) return false; while($dir=readdir($handle)) {if(pattern_match($pattern,$dir)) $output[]=$dir; } closedir($handle); if(is_array($output)) return $output; return false; } function pattern_match($pattern,$string) {#basically prepare a regular expression $out=null; $chunks=explode(';',$pattern); foreach($chunks as $pattern) {$escape=array('$','^','.','{','}', '(',')','[',']','|'); while(strpos($pattern,'**')!==false) $pattern=str_replace('**','*',$pattern); foreach($escape as $probe) $pattern=str_replace($probe,"\\$probe",$pattern); $pattern=str_replace('?*','*', str_replace('*?','*', str_replace('*',".*", str_replace('?','.{1,1}',$pattern)))); $out[]=$pattern; } if(count($out)==1) return(eregi("^$out[0]$",$string)); else foreach($out as $tester) if(eregi("^$tester$",$string)) return true; return false; } } ?> This function is case insensitive, but if needed, you can do this to make it behave depending on os: * replace eregi in the example with my_regexp add this function <?php function my_regexp($pattern,$probe) {$sensitive=(PHP_OS!='WIN32'); $sensitive=false; return ($sensitive? ereg($pattern,$probe): eregi($pattern,$probe)); } ?> viajy
this is a recursive function i wrote to return an array of all subdirectories of a dir function listdirs($dir) { static $alldirs = array(); $dirs = glob($dir . '/*', GLOB_ONLYDIR); if (count($dirs) > 0) { foreach ($dirs as $d) $alldirs[] = $d; } foreach ($dirs as $dir) listdirs($dir); return $alldirs; } example: print_r(listdirs('/some/path')); 23-jan-2005 09:54
The example on this page will generate a warning if the glob function does not find any filenames that match the pattern. The glob function result will only be an array if it finds some files and the foreach statement requires its argument to be an array. By checking for the possibility that the result of the glob function may not be an array you can eliminate the warning. Here's a better example: <?php $matches = glob("*.txt"); if ( is_array ( $matches ) ) { foreach ( $matches as $filename) { echo "$filename size " . filesize($filename) . "\n"; } } ?> redcube
The answer for the difference in the dirsize function of "management at twilightus dot net": glob('*') ignores all 'hidden' files by default. This means it does not return files that start with a dot (e.g. ".file"). If you want to match those files too, you can use "{,.}*" as the pattern with the GLOB_BRACE flag. <?php // Search for all files that match .* or * $files = glob('{,.}*', GLOB_BRACE); ?> Note: This also returns the directory special entries . and .. michael t. mcgrew
Take all file names in the directory and put them in a link. <?php foreach (glob("*.*") as $filename) { echo "<a href=\"".$filename."\">".$filename."</a><br/>"; } ?> nataxia
Something I used to sort dir & subdir into array (multidimensional) reflecting dir structure. function getRecursiveFolderList($curDir,$currentA=false) { $dirs = glob($curDir . '/*', GLOB_ONLYDIR); $cur = 0; foreach($dirs as $dir) { $currentA[$cur]['path'] = $dir; $currentA[$cur] = $this->getRecursiveFolderList($dir,$currentA[$cur]); ++$cur; } return $currentA; } leon
Since this function is a wrapper for the OS function of the same name, you may find it helpful to look at the man page while the exact PHP implementation is sorted out. You might have some luck passing in the literal values of the constants defined in /usr/include/glob.h. For example, GLOB_NOSORT is defined as (1 << 2), which is 4. In PHP, glob('*.php', 4) will returns an unsorted list for me in RH 7.x. YMMV. 25-mar-2007 05:41
Reply to ny_obaATgmxDOTnet: You could also use sql_regcase() to build a pattern for case insensitive matches. You may also want to set the locale before, so it is used when building the pattern. <?php $pattern = sql_case("*.pdf"); var_dump(glob($pattern)); ?> should therefore match file.pdf AND OtherFile.PDF See http://www.php.net/sql_regcase for more information. michaelsoft
Note that, in some configurations, the search is case-sensitive! You'll need to have something like: <?php $images = glob("/path/to/images/{*.jpg,*.JPG}", GLOB_BRACE); ?> Also on some servers, I have seen such scripts 'crash' with an CGI Error ("...not returning a complete set of HTTP headers...") when glob could not find any match! c_windows_temp
Note that this function does not list broken symbolic links.
jacob eisenberg
Note that on Windows, glob distinguishes between uppercase and lowercase extensions, so if the directory contains a file "test.txt" and you glob for "*.TXT" then the file will not be found! That bug only happens when you use patterns containing "*", like the example above. If you for example search for the full filename "test.TXT" then everything works correctly. lesion
Maybe all of you still know this, but it seems that if the directory contains some unresolved symlink, glob() simply ignore those files.
paul gregg / qube #efnet
Just threw this together in response to a common question in irc: Available at: http://www.pgregg.com/projects/ http://www.pgregg.com/projects/php/code/preg_find.phps preg_find() - A function to search in a directory for files or directories matching a preg_ pattern. Tell it the pattern, the start directory and some optional flags and it will return an array of files and their associated stat() details. If you just want the filenames, just do an array_keys() on the result. e.g. $files = preg_find("/\.php$/", '.', PREG_FIND_RECURSIVE); will find all files ending in .php in the current directory and below. Options are: // PREG_FIND_RECURSIVE - go into subdirectorys looking for more files // PREG_FIND_DIRMATCH - return directorys that match the pattern also // PREG_FIND_FULLPATH - search for the pattern in the full path (dir+file) // PREG_FIND_NEGATE - return files that don't match the pattern // to use more than one simple seperate them with a | character Hope you find it useful. Paul. nospam sketch
in the example below, i found i got an error if the directory was empty. <?php foreach (glob("*.txt") as $filename) { echo "$filename size " . filesize($filename) . "\n"; } ?> I think its because glob()'ing an empty directory returns false, and so calling foreach (false as $value) will obviously break. to fix this, i did the following: <?php $files = glob("*.txt) or array(); // give it an empty array if the directory is empty or glob fails otherwise echo "$filename size " . filesize($filename) . "\n"; } ?> Hope this helps someone guilleva
In some systems (AIX for example) GLOB_BRACE isn't defined and you get the error: glob() expects parameter 2 to be long, string given in /XX/XX.php <? foreach (glob("{*.pdf,*.PDF}",GLOB_BRACE ) as $filename) { echo "$filename \n"; } ?> The method may help you in this case. <? foreach (array_merge(glob("*.pdf"),glob("*.PDF")) as $filename) { echo "$filename \n"; } ?> mjs15451
In regards to the comments made by: NOSPAM sketch at infinite dot net dot au, he is wrong about Unix/Linux (I can't speak for Windows). I am running PHP 5.0.4 and I ran a bunch of different tests on relative and absolute paths using the glob function and they all work on Unix/Linux. I also tested glob on empty directories and patterns which don't match any files (even directories or files which don't exist) and it __always__ returns an empty array. I couldn't get the glob function to return false so it looks like it always returns an array.
hofmann dot niklas
if your script runs in a directory which contains brackets "[" and "]" glob does not work. example: script path: c:/dir1/[baddir]/dir2/script.php Ãf you use glob("c:/*") or similar calls in this script, it will fail!! you do not even have to use the brackets in the first parameter of glob! martin dot rode
If you don't have PHP >= 4.3 available and don't want to hassle with PHP (:-) do something like this on GNU/Linux: <?php foreach (explode("\n",`find -type d -maxdepth 1 ! -name ".*" -printf "%f\n" `) as $dirname) { print $dirname; } ?> With the "find" you can "glob" whatever you like. opessin
If this function is not available in your version of PHP, think looking at the 'Directory Functions' which can be used instead. http://www.php.net/manual/en/ref.dir.php admiral
I've written a function that I've been using quite a lot over the past year or so. I've built whole websites and their file based CMSs based on this one function, mostly because (I think) databases are not as portable as groups of files and folders. In previous versions, I used opendir and readdir to get contents, but now I can do in one line what used to take several. How? Most of the work in the whole script is done by calling glob("$dir/*") Giving me an array containing the names of the items in the folder, minus the ones beginning with '.', as well as the ones I specify. <?php /* alpharead version 3: This function returns an array containing the names of the files inside any given folder, excluding files that start with a '.', as well as the filenames listed in the '$killit' array. This array is sorted using the 'natural alphabetical' sorting manner. If no input is given to the function, it lists items in the script's interpreted folder. Version 3 fixes a MAJOR bug in version 2 which corrupted certain arrays with greater than 5 keys and one of the supposedly removed filenames. written by Admiral at NuclearPixel.com */ function alpharead3($dir){ if(!$dir){$dir = '.';} foreach(glob("$dir/*") as $item){$sort[]= end(explode('/',$item));} $killit = array('index.html', 'index.php', 'thumbs.db', 'styles.css'); $killcounter = 0; foreach($sort as $sorteditem){ foreach($killit as $killcheck){ if(strtolower($sorteditem) == strtolower($killcheck)) {unset($sort[$killcounter]);} }$killcounter++;} if($sort){natsort($sort);} foreach($sort as $item){$return[]= $item;} if(!$return){return array();} return $return; } //some basic usage $folder = 'images'; foreach(alpharead3($folder) as $item) { echo '<img src="'.$folder.'/'.$item.'"> '.$item."\n"; } ?> Commens on this function are welcome! management
I was making a directory filesize function but found there's a slight difference between glob and readdir in terms of getting sizes. <?php function dirsize_glob($dir) { $size = 0; $dir .= (!ereg('/$', $dir)) ? '/' : ''; foreach (glob($dir . '*') as $file) { $size += (is_dir($file)) ? dirsize_glob($file) : filesize($file); } return $size; } function dirsize_readdir($dir) { $size = 0; $dir .= (!ereg('/$', $dir)) ? '/' : ''; $handle = opendir($dir); while (($file = readdir($handle)) !== FALSE) { if (!ereg('^\.{1,2}$', $file)) { $size += (is_dir($dir . $file)) ? dirsize_readdir($dir . $file) : filesize($dir . $file); } } closedir($handle); return $size; } ?> For a directory that's 529216 bytes, readdir correctly gives 529216 while glob gives 528996, a difference of 220 bytes. Anyone know why there's such a difference? dangerousdave86
I think redcube at gmx dot de's comment @ http://uk3.php.net/manual/en/function.glob.php#68869 should be added to the manual entry for this function, very useful information when trying to get every single file in a directory.
tmm
I have written my own function for searching files, but it only supports ? and * However it should be easily expandable. <?php // e.g. $matches=GetMachingFiles(GetContents("."),"*.txt"); function GetMatchingFiles($files, $search) { // Split to name and filetype if(strpos($search,".")) { $baseexp=substr($search,0,strpos($search,".")); $typeexp=substr($search,strpos($search,".")+1,strlen($search)); } else { $baseexp=$search; $typeexp=""; } // Escape all regexp Characters $baseexp=preg_quote($baseexp); $typeexp=preg_quote($typeexp); // Allow ? and * $baseexp=str_replace(array("\*","\?"), array(".*","."), $baseexp); $typeexp=str_replace(array("\*","\?"), array(".*","."), $typeexp); // Search for Matches $i=0; foreach($files as $file) { $filename=basename($file); if(strpos($filename,".")) { $base=substr($filename,0,strpos($filename,".")); $type=substr($filename,strpos($filename,".")+1,strlen($filename)); } else { $base=$filename; $type=""; } if(preg_match("/^".$baseexp."$/i",$base) && preg_match("/^".$typeexp."$/i",$type)) { $matches[$i]=$file; $i++; } } return $matches; } And if someone's searching for a function which gets all files from a directory including the subdirectories: // Returns all Files contained in given dir, including subdirs function GetContents($dir,$files=array()) { if(!($res=opendir($dir))) exit("$dir doesn't exist!"); while(($file=readdir($res))==TRUE) if($file!="." && $file!="..") if(is_dir("$dir/$file")) $files=GetContents("$dir/$file",$files); else array_push($files,"$dir/$file"); closedir($res); return $files; } ?> info
I have been working towards a CMS-type design that is both modular and quite flat. For example, included files are all one level below the installation folder. glob() just help me get rid of a lot of opendir() hassle. I wasn't sure if the double asterix would work - but it's fine: foreach (glob(SERVER_PATH."/*/includes/*.php") as $inc) { require($inc); } ryan
Here's an example of how to use the GLOB_BRACE flag: <?php $images = glob("/path/to/images/{*.gif,*.jpg,*.png}", GLOB_BRACE); ?> It's also worth noting that when using the GLOB_BRACE flag in any version of PHP prior to 4.3.4, PHP will crash if no matches are found. cgamedude
Here is the *correct* way to do a reverse-alphabetical search: <? $Results = glob( 'blah.*' ); rsort( $Results ); ?> There now, wasn't that easy? :) torch
Here is simple function that will find and remove all files (except "." ones) that match the expression ($match, "*" as wildcard) under starting directory ($path) and all other directories under it. function rfr($path,$match){ static $deld = 0, $dsize = 0; $dirs = glob($path."*"); $files = glob($path.$match); foreach($files as $file){ if(is_file($file)){ $dsize += filesize($file); unlink($file); $deld++; } } foreach($dirs as $dir){ if(is_dir($dir)){ $dir = basename($dir) . "/"; rfr($path.$dir,$match); } } return "$deld files deleted with a total size of $dsize bytes"; } cjcommunications
Here is a way I used glob() to browse a directory, pull the file name out, resort according to the most recent date and format it using date(). I called the function inside a <select> and had it go directly to the PDF file: function browsepdf(){ $pdffile=glob("printable/*.pdf"); rsort($pdffile); foreach($pdffile as $filename){ $filename=ltrim($filename, "printable/"); $filename=rtrim($filename, ".pdf"); $file=$filename; $datetime=strtotime($filename); $newdate=strtotime("+3 days",$datetime); $filenamedate=date("F d", $datetime); $filenamedate.=" - ".date("F d, Y", $newdate); echo "<option value='$file'>$filenamedate</option>"; } } martinlarsen
glob() does not work if the path contains brackets "[" and "]". For example, this will make it fail: $files = glob("[myfolder]/*.txt"); No error is returned, just an empty array! fraggy
glob caused me some real pain in the buttom on windows, because of the DOS thing with paths (backslashes instead of slashes)... This was my own fault because I "forgot" that the backslash, when used in strings, needs to be escaped, but well, it can cause a lot of confusion, even for people who are not exactly newbies anymore... For some reason, I didn't have this problem with other file operations (chdir, opendir, etc...), which was the most confusing of all... So, for people running scripts on Windows machines (Dos95, 98 or WinNT or DosXP), just remember this: glob('c:\temp\*.*'); // works correctly, returns an array with files. glob("c:\temp\*.*"); // does NOT work... the backslashes need to be escaped... glob("c:\\temp\\*.*"); // that works again... This is especially confusing when temporary writable directories are returned as an unescaped string. $tempdir = getenv('TEMP'); // this returns "C:\DOCUME~1\user\LOCALS~1\Temp" so in order to scan that directoy I need to do: glob($tempdir . "\\*.*"); Or perhaps it's easier to replace all backslashes with slashes in order to avoid these kinds of confusions... glob("c:/temp/*.*"); // works fine too... I know I'm not contributing anything new here, but I just hope this post may avoid some unnecessary headaches... edogs
funny enough, but our testing opendir VS glob show advantage of opendir by speed 0.00115704536438 and 0.0068039894104 or if to pass 200 times 0.210277080536 vs 1.2976038456 ny_obaatgmxdotnet
Case insensitive version of this function for mswin: // only supported flags are GLOB_NOSORT | GLOB_ONLYDIR function iglob($pattern, $flags) { $path = preg_split( '#(?<=\A|[\\\\/])((?>[^\\\\/*?]*)[*?](?>[^\\\\/]*))(?=\Z|[\\\\/])#', $pattern, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY ); foreach ($path as &$n) if (preg_match('/[*?]/', $n)) { $re = ''; for ($i = 0, $l = strlen($n); $i < $l; $i++) switch($n{$i}) { case '*': $re .= '.*'; break; case '?': $re .= '.'; break; default: $re .= sprintf('\x%02x', ord($n{$i})); } $n = array(0, "/^$re$/i"); } else $n = array(1, $n); $res = array(); iglob_DFS($path, $flags, '', 0, $res); if (!($flags & GLOB_NOSORT)) sort($res); return $res; } function iglob_DFS($path, $flags, $parent, $lvl, &$res) { $depth = count($path) - 1; if (($lvl < $depth) && $path[$lvl][0]) $parent .= $path[$lvl++][1]; $files = array(); if ($path[$lvl][0]) $files[] = $path[$lvl][1]; else if ($d = @opendir(($parent == '') ? '.' : $parent)) { while (($n = readdir($d)) !== false) if ($n != '.' && $n != '..') $files[] = $n; closedir($d); } foreach ($files as $f) if ($path[$lvl][0] || preg_match($path[$lvl][1], $f)) { $fullpath = $parent.$f; if ($lvl == $depth) { if (!($flags & GLOB_ONLYDIR) || is_dir($fullpath)) $res[] = $fullpath; } else iglob_DFS($path, $flags, $fullpath, $lvl + 1, $res); } } 29-jan-2005 10:09
Be aware... On Windows you need to add "/" mark: <?php $files = glob("/dir/*.txt"); // Works properly. $files = glob("dir/*.txt"); // Failure!, first letter is missing on every filename! ?> On Unix you cant add the "/" mark: <?php $files = glob("dir/*.txt"); // Works properly. $files = glob("/dir/*.txt"); // No files found! ?> Hope this will save your time :) per lundberg
Be aware that on UNIX, * as the pattern will *not* match dot-files and dot-directories. Knowing this will save you some headache. :-) May He bless you.
sam yong - hellclanner
An alternative to this glob function. Like what edogs [at] dogsempire.com said, opendir should be faster than glob. I have not tested timing for this function but it works perfectly for me on my PHP v5.2.2 server. <?php $_foo ='/server/public_html/path/'; function s_glob($dir){ $files = array(); if(is_dir($dir)){ if($dh=opendir($dir)){ while(($file = readdir($dh)) !== false){ $files[]=$dir.$file; }} } return $files; } print_r(s_glob($_foo)); ?> This function returns an empty array if no files are found in the directory or the path specified is not a directory. deviant
A slight edit on the globr() function stated by sthomas. This does exactly the same just works on windows systems for < PHP 4.3.3. : <?php function globr($sDir, $sPattern, $nFlags = NULL) { $aFiles = glob("$sDir/$sPattern", $nFlags); $files = getDir($sDir); if (is_array($files)) { foreach( $files as $file ) { $aSubFiles = globr($file, $sPattern, $nFlags); $aFiles = array_merge($aFiles,$aSubFiles); } } return $aFiles; } function getDir($sDir) { $i=0; if(is_dir($sDir)) { if($rContents = opendir($sDir)) { while($sNode = readdir($rContents)) { if(is_dir($sDir.'/'.$sNode )) { if($sNode !="." && $sNode !="..") { $aDirs[$i] = $sDir.'/'.$sNode ; $i++; } } } } } return $aDirs; } ?> alan
A couple of notes: glob() handles symbolic filesystem links and resolves references to './', '../' nicely and handles an extra '/' character , at least on X-systems. e.g., glob("../*") will do next higher dir. This is good to use so warnings or errors show as "../foo" and not your system's full path. Several of the examples use a notation "*.*" when just plain "*" does the same thing. The "*.*" notation is misleading as it implies foo.ext will not be found with "*" because the "." is not present. Watch the flags must not be strings. They are defined constants. Thus, glob("../*", GLOB_ONLYDIR) works; glob("../*", "GLOB_ONLYDIR") does not. okumurya
4.3.8 and 4.4.2 has incompatible behavior. If there is no glob result, 4.4.2 return empty array but 4.3.8 returns FALSE. code: <?php $a = glob('hoge'); var_dump($a); ?> result at 4.3.8: bool(false) result at 4.4.2: array(0) { } sthomas
<?php /** * Recursive version of glob * * @return array containing all pattern-matched files. * * @param string $sDir Directory to start with. * @param string $sPattern Pattern to glob for. * @param int $nFlags Flags sent to glob. */ function globr($sDir, $sPattern, $nFlags = NULL) { $sDir = escapeshellcmd($sDir); // Get the list of all matching files currently in the // directory. $aFiles = glob("$sDir/$sPattern", $nFlags); // Then get a list of all directories in this directory, and // run ourselves on the resulting array. This is the // recursion step, which will not execute if there are no // directories. foreach (glob("$sDir/*", GLOB_ONLYDIR) as $sSubDir) { $aSubFiles = rglob($sSubDir, $sPattern, $nFlags); $aFiles = array_merge($aFiles, $aSubFiles); } // The array we return contains the files we found, and the // files all of our children found. return $aFiles; } ?> joseph dot morphy
<?php $html_array = glob("*.html"); function sort_by_mtime($file1,$file2) { $time1 = filemtime($file1); $time2 = filemtime($file2); if ($time1 == $time2) { return 0; } return ($time1 < $time2) ? 1 : -1; } usort($html_array,"sort_by_mtime"); //$html_array is now ordered by the time it was last modified ?> biguenique
<? //safe_glob() by BigueNique at yahoo dot ca //Function glob() is prohibited on some servers for security reasons as stated on: //http://seclists.org/fulldisclosure/2005/Sep/0001.html //(Message "Warning: glob() has been disabled for security reasons in (script) on line (line)") //safe_glob() intends to replace glob() for simple applications //using readdir() & fnmatch() instead. //Since fnmatch() is not available on Windows or other non-POSFIX, I rely //on soywiz at php dot net fnmatch clone. //On the final hand, safe_glob() supports basic wildcards on one directory. //Supported flags: GLOB_MARK. GLOB_NOSORT, GLOB_ONLYDIR //Return false if path doesn't exist, and an empty array is no file matches the pattern function safe_glob($pattern, $flags=0) { $split=explode('/',$pattern); $match=array_pop($split); $path=implode('/',$split); if (($dir=opendir($path))!==false) { $glob=array(); while(($file=readdir($dir))!==false) { if (fnmatch($match,$file)) { if ((is_dir("$path/$file"))||(!($flags&GLOB_ONLYDIR))) { if ($flags&GLOB_MARK) $file.='/'; $glob[]=$file; } } } closedir($dir); if (!($flags&GLOB_NOSORT)) sort($glob); return $glob; } else { return false; } } //thanks to soywiz for the following function, posted on http://php.net/fnmatch //soywiz at php dot net //17-Jul-2006 10:12 //A better "fnmatch" alternative for windows that converts a fnmatch pattern into a preg one. It should work on PHP >= 4.0.0 if (!function_exists('fnmatch')) { function fnmatch($pattern, $string) { return @preg_match('/^' . strtr(addcslashes($pattern, '\\.+^$(){}=!<>|'), array('*' => '.*', '?' => '.?')) . '$/i', $string); } } ?> |
Change Languagebasename chgrp chmod chown clearstatcache copy delete dirname disk_free_space disk_total_space diskfreespace fclose feof fflush fgetc fgetcsv fgets fgetss file_exists file_get_contents file_put_contents file fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype flock fnmatch fopen fpassthru fputcsv fputs fread fscanf fseek fstat ftell ftruncate fwrite glob is_dir is_executable is_file is_link is_readable is_uploaded_file is_writable is_writeable lchgrp lchown link linkinfo lstat mkdir move_uploaded_file parse_ini_file pathinfo pclose popen readfile readlink realpath rename rewind rmdir set_file_buffer stat symlink tempnam tmpfile touch umask unlink |