is_dir

(PHP 3, PHP 4, PHP 5)

is_dir -- 判断给定文件名是否是一个目录

说明

bool is_dir ( string filename )

如果文件名存在并且为目录则返回 TRUE。如果 filename 是一个相对路径,则按照当前工作目录检查其相对路径。

注: 本函数的结果会被缓存。更多信息参见 clearstatcache()

例子 1. is_dir() 例子

<?
var_dump
(is_dir('a_file.txt')) . "\n";
var_dump(is_dir('bogus_dir/abc')) . "\n";

var_dump(is_dir('..')); //one dir up
?>

上例将输出:

bool(false)
bool(false)
bool(true)

提示: PHP 5.0.0 起本函数也可被某些 URL wrapper 使用。参考附录 L 来看哪些 wrapper 支持 stat() 系列函数的功能。

参见 chdir()diropendir()is_file()is_link()


add a note add a note User Contributed Notes
Eric
25-Oct-2006 04:53
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
Eric Peterson
24-Oct-2006 08:48
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)) {
alan dot rezende at light dot com dot br
29-Sep-2006 09:42
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)<br>";
 
if (is_dir($file)){
   print
"<a href='$file/' class='text1'>$file</a><br>";
  }
}
?>
This code will turn into an empty list. If you want to make sure, uncomment the commented line...
Regards...
locataweb at hotmail dot com
07-Aug-2006 06:59
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.
derek at nospam dot pmachine dot com
15-Jul-2006 07:10
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.
dmertens-php-note at zyprexia dot com
24-Sep-2005 11:53
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..
fanfatal at fanfatal dot pl
03-Jul-2005 12:04
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 ;)
...
07-Jun-2005 02: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
akashif at freezone dot co dot uk
03-Jun-2005 07:50
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><br>";
           }
           else
           {
               echo
"<a href='$node'>$node</a><br>";
           }
       }
   }
}

?>
renich at woralelandia dot com
22-Apr-2005 02:45
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> <br>\n");
           }
           else
           {
              
// Print Dirs with link
              
print ("<a href=\"http://$url[Host]$dir\" target=\"$target\">$dir</a> <br>\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)
dusted19 at hotmail dot com
20-Mar-2005 06:38
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<br>");
               }

           }

//      }
  
}
  
$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.
flobee
14-Mar-2005 10:13
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/');

?>
puremango dot co dot uk at gmail dot com
09-Feb-2005 03:55
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
03-Feb-2005 08: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;
}
tibard at gmail dot com
02-Feb-2005 04:32
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;
}

?>
rchavezc at ameritech dot net
13-Dec-2004 12:19
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;
}
?>
bhuskins at nospam dot christian-horizons dot org
13-Aug-2004 04:51
'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
}
?>
sly at noiretblanc dot org
29-May-2004 01:10
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.
p dot marzec at bold-sg dot pl
14-Mar-2004 11:33
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;
}
andreas at rueping dot net
24-Sep-2003 08:29
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
}
?>