PHP: is_dir - Manual

downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

is_executable glob

Last updated: Sat, 27 Jan 2007

view this page in

# 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('..')); //на одну директорию выше ?>`

Результат выполнения данного примера:

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

> Подсказка: Начиная с `PHP 5.0.0`, эта функция также может быть использована с некоторыми упаковщиками url. Список упаковщиков, поддерживаемых семейством функций stat(), смотрите в Прил. M.

См. также описание функций chdir(), dir, opendir(), is_file() и is_link().

add a note User Contributed Notes
is_dir
gecko4 at gmail dot com
24-Feb-2007 09:03
`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';
?>`
18-Jan-2007 05: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.`
Eric
24-Oct-2006 01: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
23-Oct-2006 05: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 06: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
06-Aug-2006 03: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
14-Jul-2006 04: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 08: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
02-Jul-2005 09: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 ;)
...`
06-Jun-2005 11: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 04: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
21-Apr-2005 11: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
19-Mar-2005 02: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
13-Mar-2005 06: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
08-Feb-2005 11: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`
02-Feb-2005 04: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
01-Feb-2005 12: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
12-Dec-2004 08: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
12-Aug-2004 01: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
28-May-2004 10: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 07: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
23-Sep-2003 05: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
}
?>`
add a note
is_executable glob

Last updated: Sat, 27 Jan 2007
show source | credits | stats | sitemap | contact | advertising | mirror sites
Copyright © 2001-2007 The PHP Group
All rights reserved.
This mirror generously provided by: Yahoo! Inc.
Last updated: Sat Mar 10 09:32:46 2007 PST