|
is_dir
Tells whether the filename is a directory
(PHP 4, PHP 5)
Example 653. is_dir() example<?php The above example will output: bool(false) Related Examples ( Source code ) » is_dir Examples ( Source code ) » Creating and Destroying a Directory Handle Examples ( Source code ) » Deleting a Directory by Using rmdir() Examples ( Source code ) » Listing the Contents of a Directory with readdir() Examples ( Source code ) » Calculate the size for a directory Examples ( Source code ) » Print all files under a directory Examples ( Source code ) » Reading Contents from a Directory Examples ( Source code ) » Is the file a directory Examples ( Source code ) » Save Upload File to a new directory Examples ( Source code ) » Define recursive function to delete directories Examples ( Source code ) » Query the Google API using SOAP and PHP. Code Examples / Notes » is_dir06-jun-2005 07:30
With error reporting set to all, and you attempt to do: echo var_dump(is_dir('bogus_dir/abc')); as output you will get: Warning: stat failed for bogus_dir/abc (errno=2 - No such file or directory) in test.php on line 12 bool(false) If you want to use this with an error reporting level set to all, you will need to use @ to supress the generated error dusted19
While working on a php project (my first one =( ). I ran into a bug using is_dir() on my winxp w/ servicepack 2 system. I'm using php 4.3.10.. the problem is whenever i pass is_dir() a pathname that is longer then 256 characters long it will ALWAYS return true. CODE: <?php // Path to multimedia files $mpath = "E:\\armoury\\"; ls($mpath); //echo "MP3 Listing:<br/><br/>"; function ls ($curpath) { $dir = dir($curpath); echo("<b>$curpath</b>"); echo "<blockquote>"; while ($file = $dir->read()) { echo(" <b>"); echo(strlen($curpath.$file)); echo("</b> "); if($file != "." && $file != "..") { if (is_dir($curpath.$file)) { ls($curpath.$file."\\"); } else { echo(" $file "); } } // } } $dir->close(); echo "</blockquote>"; return; } ?> This is the output.. the number preceding the file/directory is the number of characters in it's full path name. You can see where it trips up at: 257 E:\armoury\[ hiphop - dub - reggae - soul ]\A Tribe Called Quest - 1990 - People's Instinctive Travels And The Paths Of Rhythm\A Tribe Called Quest - People's Instinctive Travels And The Paths Of Rhythm - 10 - Rhythm (Devoted To The Art Of Moving Butts).mp3 The pathname is greater then 256 characters. 229 A Tribe Called Quest - People's Instinctive Travels And The Paths Of Rhythm - 07 - Bonita Applebum.mp3 227 A Tribe Called Quest - People's Instinctive Travels And The Paths Of Rhythm - 08 - Can I Kick It.mp3 233 A Tribe Called Quest - People's Instinctive Travels And The Paths Of Rhythm - 09 - Youthful Expression.mp3 257 E:\armoury\[ hiphop - dub - reggae - soul ]\A Tribe Called Quest - 1990 - People's Instinctive Travels And The Paths Of Rhythm\A Tribe Called Quest - People's Instinctive Travels And The Paths Of Rhythm - 10 - Rhythm (Devoted To The Art Of Moving Butts).mp3\ 259 260 267 E:\armoury\[ hiphop - dub - reggae - soul ]\A Tribe Called Quest - 1990 - People's Instinctive Travels And The Paths Of Rhythm\A Tribe Called Quest - People's Instinctive Travels And The Paths Of Rhythm - 10 - Rhythm (Devoted To The Art Of Moving Butts).mp3\index.php\ 269 270 277 E:\armoury\[ hiphop - dub - reggae - soul ]\A Tribe Called Quest - 1990 - People's Instinctive Travels And The Paths Of Rhythm\A Tribe Called Quest - People's Instinctive Travels And The Paths Of Rhythm - 10 - Rhythm (Devoted To The Art Of Moving Butts).mp3\index.php\index.php\ Try it yourself on a large directory structure. tibard
use this function to get all files inside a directory (including subdirectories) <?php function scan_Dir($dir) { $arrfiles = array(); if (is_dir($dir)) { if ($handle = opendir($dir)) { chdir($dir); while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") { if (is_dir($file)) { $arr = scan_Dir($file); foreach ($arr as $value) { $arrfiles[] = $dir."/".$value; } } else { $arrfiles[] = $dir."/".$file; } } } chdir("../"); } closedir($handle); } return $arrfiles; } ?> 03-feb-2005 12:12
Unfortunately, the function posted by p dot marzec at bold-sg dot pl does not work. The corrected version is: // returns true if folder is empty or not existing // false if folde is full function is_empty_folder($dir) { if (is_dir($dir)) { $dl=opendir($dir); if ($dl) { while($name = readdir($dl)) { if (!is_dir("$dir/$name")) { //<--- corrected here return false; break; } } closedir($dl); } return true; } else return true; } rchavezc
This is the function that I use to test for an empty directory: <?php function is_emtpy_dir($dirname){ // Returns true if $dirname is a directory and it is empty $result=false; // Assume it is not a directory if(is_dir($dirname) ){ $result=true; // It is a directory $handle = opendir($dirname); while( ( $name = readdir($handle)) !== false){ if ($name!= "." && $name !=".."){ $result=false; // directory not empty break; // no need to test more } } closedir($handle); } return $result; } ?> sly
This is the "is_dir" function I use to solve the problems : function Another_is_dir ($file) { if ((fileperms("$file") & 0x4000) == 0x4000) return TRUE; else return FALSE; } or, more simple : function Another_is_dir ($file) { return ((fileperms("$file") & 0x4000) == 0x4000); } I can't remember where it comes from, but it works fine. puremango dot co dot uk
this function bypasses open_basedir restrictions. <? function my_is_dir($dir) { // bypasses open_basedir restrictions of is_dir and fileperms $tmp_cmd = `ls -dl $dir`; $dir_flag = $tmp_cmd[0]; if($dir_flag!="d") { // not d; use next char (first char might be 's' and is still directory) $dir_flag = $tmp_cmd[1]; } return ($dir_flag=="d"); } ?> example: <? .... echo is_dir("/somewhere/i/dont/have/access/to"); ?> output: Warning: open_basedir restriction in effect <? .... echo my_is_dir("/somewhere/i/dont/have/access/to"); ?> output: true (or false, depending whether it is or not...) --- visit puremango.co.uk for other such wonders alan dot rezende
The function is_dir will always return false if the handle acquired with opendir is not from the current working directory (getcwd); exception applies to "." and "..". Thus, if you need a consistent dir listing from any directory other than the current one, you must change dir first. Example follows: <?php chdir( '..' ); $rep=opendir('.'); while (false != ($file = readdir($rep))){ if (is_dir($file)){ print("<a href='$file/' class='text1'>$file</a>"); } } ?> The above code will list all directories (with links) for the ".." directory, relative to the current working dir. THE WRONG WAY TO DO IT FOLLOWS: <?php $rep=opendir('..'); while (false != ($file = readdir($rep))){ //print "$file is here (may be a dir or not) "; if (is_dir($file)){ print "<a href='$file/' class='text1'>$file</a> "; } } ?> This code will turn into an empty list. If you want to make sure, uncomment the commented line... Regards... p dot marzec
Simplest version 'is_empty_folder' posted by andreas at rueping dot net // returns true if folder is empty or not existing // false if folde is full function is_empty_folder($dir) { if (is_dir($dir)) { $dl=opendir($dir); if ($dl) { while($name = readdir($dl)) { if (!is_dir($name)) { return false; break; } } closedir($dl); } return true; } else return true; } danr
Running PHP 5.2.0 on Apache Windows, I had a problem (likely the same one as described by others) where is_dir returned a False for directories with certain permissions even though they were accessible. Strangely, I was able to overcome the problem with a more complete path. For example, this only displays "Works" on subdirectories with particular permissions (in this directory about 1 out of 3): $d = opendir("./albums/mydir"); while(false !== ($f = readdir($d))) { echo "<hr />"; if(is_dir($f)) { echo "<b>Works:" . $f . "</b>"; } } However, this works properly for all directories: $d = opendir("./albums/mydir"); while(false !== ($f = readdir($d))) { echo "<hr />"; $dName = "./albums/mydir/" . $f; if(is_dir($dName)) { echo "<b>Works:" . $dName . "</b>"; } } I don't understand the hit-and-miss of the first code, but maybe the second code can help others having this problem. dmertens-php-note
Remember that the owner of the directory has to be the same of the script user, otherwise this function will always return false when PHP is running in safe_mode..
derek
regarding dmertens-php-note at zyprexia dot com's statement on 24-Sep-2005 09:53 Actually, is_dir is not affected by UID checks in safe_mode. is_dir will even return true if you lack sufficient privileges to read said directory. flobee
note: like the main example already shows. tooks me houres to understand und using chdir() to get a full dir scann (especilly on windows and "mounted" network drives) never forget the tailing slash to find out if you have a directory or not. <?php function parse_dir($dir) { if ($dh = @opendir($dir)) { while(($file = readdir($dh)) !== false) { if( !preg_match('/^\./s', $file) ) { if(is_dir($dir.$file)) { $newdir = $dir.$file.'/'; // <- tailing slash chdir($newdir); echo "IS DIR: $newdir\n"; echo parse_dir($newdir); } else { echo $dir.$file."\n"; } } } chdir('..'); } } parse_dir('z:/myfolder/mysubfolder/'); ?> locataweb
NOTE on Windows Shares (based on tests using PHP 5.1.1): After many hours of head scratching and wondering why a script worked sometimes but not others, I discovered this revelation. Be aware that base Windows shares are not recognised as dirs, so the following test will return false even if \\COMPUTER_NAME\SHARENAME exists. <?php if (is_dir('\\\\COMPUTER_NAME\\SHARENAME')) { echo "TRUE\n"; } else { echo "FALSE\n"; } //will return FALSE; // However testing a subdir of the same base share // using test below will return TRUE, // despite the fact the parent base Windows share // returns false when tested by is_dir() is_dir('\\\\COMPUTER_NAME\\SHARENAME\\SUBDIR') { echo "TRUE\n"; } else { echo "FALSE\n"; } //will return TRUE. ?> As a work round I replaced is_dir with is_readable() instead, which identifies if the share is readable and so must exist, but this is clearly dependent on whether the share is readable. I hope this helps someone. If there is a better work round or other purpose built solution to this problem with base windows shares, please post them so I'll know the next time. akashif
just a simple script to for those who dont have the IIS or Apache Dirlisting available , this will make onr for you <?php $DirPath=$_GET['DirPath']; if($DirPath=="") { $DirPath='./'; } if (($handle=opendir($DirPath))) { while ($node = readdir($handle)) { $nodebase = basename($node); if ($nodebase!="." && $nodebase!="..") { if(is_dir($DirPath.$node)) { $nPath=$DirPath.$node."/"; echo "-> -> -> <a href='dir.php?DirPath=$nPath'>$node</a> "; } else { echo "<a href='$node'>$node</a> "; } } } } ?> eric peterson
I'm not sure what is going on here... I have a function to return a listing of (sub)directories within a directory. Works great until I ran into the directory given in the warning below... 87 characters seems too short to be running into a file/directory name length issue? This is what I'm getting (though broken into a couple lines so this forum will accept it): Warning: is_dir(): Stat failed for /home/office/public_html/Library/1_NNHP-produced/4_Maps /Peterson2003/BRTEreport_DVD.zip (errno=75 - Value too large for defined data type) in /home/office/public_html/index.php on line 104 Here is line 104: if (is_dir($dir . "/" . $listing)) { legolas558 d0t users dot sf dot net
I had troubles at checking for the existance of a directory under the windows temporary path (usually c:\windows\temp\). I am using PHP 5.2.0 See also the bug tracker item: http://bugs.php.net/bug.php?id=39198 Here below the replacement function which works under the Windows temporary directory. It is a bad hack, since it creates and then removes the directory to verify its existance! But I could not find an alternative solution, that bug should be fixed. <?php function temp_is_dir($dir) { // check directory existance under temp folder (tested on Windows) // see bug #31918 http://bugs.php.net/bug.php?id=39198 // by legolas558 if (!@mkdir($dir)) return true; rmdir($dir); return false; } ?> e dot loiseau
I had the same problem as others with not using the complete path to a folder when usin is_dir. It's really important to use complete path. $folder = "../pictures"; $dossier = opendir($folder); while ($Fichier = readdir($dossier)) { if ($Fichier != "." && $Fichier != ".." && $Fichier != "Thumbs.db") { // if(is_dir($Fichier)) { // Do not always works if(is_dir($folder."/".$Fichier)) { // Works always echo "$Fichier"; } // fin if is file } // fin if restriction des fichiers à ne pas afficher } // fin while closedir($dossier); Edouard fanfatal
Hi I wrote an usefull function to check is directory exists in directory's tree ;) <?php /* * Function to check recursively if dirname is exists in directory's tree * * @param string $dir_name * @param string [$path] * @return bool * @author FanFataL */ function dir_exists($dir_name = false, $path = './') { if(!$dir_name) return false; if(is_dir($path.$dir_name)) return true; $tree = glob($path.'*', GLOB_ONLYDIR); if($tree && count($tree)>0) { foreach($tree as $dir) if(dir_exists($dir_name, $dir.'/')) return true; } return false; } ?> Greatings ;) ... gecko4
Here is another way to test if a directory is empty, which I think is much simpler than those posted below: <?php $dir = 'directory'; echo (count(glob("$dir/*")) === 0) ? 'Empty' : 'Not empty'; ?> renich
Here goes a PHP5.0 link-to-directory listing function and examples <?php //List directories only function list_dirs($path, $target) { $list = scandir($path); foreach ($list as $number => $filename) { if ( $filename !== '.' && $filename !== '..' && is_dir("$path/$filename") ) { // Asign more readable and logic variables $dir = $filename; $url = apache_request_headers(); if ($target == '') { // Print Dirs with link print ("<a href=\"http://$url[Host]/$path/$dir\">$dir</a> \n"); } else { // Print Dirs with link print ("<a href=\"http://$url[Host]$dir\" target=\"$target\">$dir</a> \n"); } } } } ?> 1.- List current directory's directories with no target property. <?php list_dirs('.','') ?> 2.- List "libraries" in "pma2" located at my dir with a "_blank" target set <?php list_dirs('pma2/libraries','_blank'); ?> or <?php list_dirs('/var/www/html/pma2/libraries','_blank'); ?> 3.- List all the directories located at the "/Home" dir with "_me" as target. <?php list_dirs('/home', ''_me'); ?> I hope you all like it! Note: Obviously, the links will now work if the're not in the apache dir... ("htdocs", "html", "www", whatever) andreas
function checks if a folder is empty or not. Retruns "true" if it is empty and "false" if it is full with data. Also if the folder doesnt even exist, function returns "true". -------------------------------------------------- -------------------------------------------------- // returns true if folder is empty or not existing // false if folde is full <? function is_emtpy_folder($folder){ if(is_dir($folder) ){ $handle = opendir($folder); while( (gettype( $name = readdir($handle)) != "boolean")){ $name_array[] = $name; } foreach($name_array as $temp) $folder_content .= $temp; if($folder_content == "...") return true; else return false; closedir($handle); } else return true; // folder doesnt exist } ?> 18-jan-2007 01:07
Be aware that is_dir() and is_file() will not work on very large (for me >2gb) files (also see http://de3.php.net/manual/en/function.is-file.php#56334). You might try this approach - it works for me: <?php function isDir($dir) { $cwd = getcwd(); $returnValue = false; if (@chdir($dir)) { chdir($cwd); $returnValue = true; } return $returnValue; } ?> Please keep in mind that isDir() will fail on directories which cannot be chdired due to permission settings for example. lordalderaan
As was said earlier by locataweb at hotmail dot com is_dir returns false on windows shares even if they exist and are accessible. I found that is_readable provides about the same functionality and does return true. It might provide a sufficient replacement in most cases. eric
Ah ha! Maybe this is a bug, or limitation to be more precise, of php. See http://bugs.php.net/bug.php?id=27792 A workaround is posted on the page (above) and seems to work for me: function is_dir_LFS($path){ return (('d'==substr(exec("ls -dl '$path'"),0,1))?(true):(false)); } PS: I'm using PHP 4.3.10-16, posts report this problem up to 5.0 bhuskins
'Is_empty_folder' posted by andreas at rueping dot net is a nice function. It did give me some grief, though. I don't beleive that it actually closes the directory when it's done (closedir in the wrong spot). I changed it slightly to be the following: // returns true if folder is empty or not existing // false if folde is full <? function is_emtpy_folder($folder){ if(is_dir($folder) ){ $handle = opendir($folder); while( (gettype( $name = readdir($handle)) != "boolean")){ $name_array[] = $name; } foreach($name_array as $temp) $folder_content .= $temp; closedir($handle);//<--------moved this if($folder_content == "...") { return true; } else { return false; } } else return true; // folder doesnt exist } ?> |
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 |