@Anonymous:
If on Linux the suggested code does not work because '.' and '..' will allways be returned, it may be possible to subtract 2 from the amount of files found.
>>echo (count(glob("$dir/*") - 2) === 0) ? 'Empty' : 'Not
In that way, I think, you have solved the problem of two extra files that are counted.
is_dir
(PHP 4, PHP 5)
is_dir — Indica si el nombre de archivo es un directorio
Descripción
Indica si el nombre de archivo dado es un directorio.
Lista de parámetros
- nombre_archivo
-
Ruta al archivo. Si nombre_archivo es un nombre de archivo relativo, éste será analizado relativo al directorio de trabajo actual.
Valores retornados
Devuelve TRUE si el archivo con el nombre dado existe y es un directorio, FALSE de lo contrario.
Ejemplos
Example #1 Ejemplo de is_dir()
<?php
var_dump(is_dir('un_archivo.txt')) . "\n";
var_dump(is_dir('directorio_falso/abc')) . "\n";
var_dump(is_dir('..')); //un directorio arriba
?>
El resultado del ejemplo seria:
bool(false) bool(false) bool(true)
Notes
Note: Los resultados de esta función son guardados. Consultar clearstatcache() para más detalles.
A partir de PHP 5.0.0, esta funcion tambien puede usarse con algunas URL como nombre de fichero. Consultar Lista de Protocolos/Envolturas Soportadas, para obtener una lista con soporte para la funcionalidad stat().
is_dir
20-Jun-2008 02:21
20-May-2008 03:28
Well, "John Doe's function" doesn't return the good value when $file != '.' && $file != '..' it must return false and not true !
Moreover, as the latest contributor told us, the directory have to be closed before returning.
This one is far safer ;-) :
<?php
function is_empty_dir($dir)
{
if ($dh = @opendir($dir))
{
while ($file = readdir($dh))
{
if ($file != '.' && $file != '..') {
closedir($dh);
return false;
}
}
closedir($dh);
return true;
}
else return false; // whatever the reason is : no such dir, not a dir, not readable
}
?>
24-Apr-2008 01:31
On the previous example you may want to closedir() before returning, I tried the function and ran into some locking issues on windows when trying to delete the directory after I ran this function.
23-Apr-2008 06:06
I altered the function below a bit. This implementation is simpler, faster and safer:
<?php
function is_empty_folder($folder) {
if (! is_dir($folder))
return false; // not a dir
$files = opendir($folder);
while ($file = readdir($files)) {
if ($file != '.' && $file != '..')
return true; // not empty
}
}
?>
22-Mar-2008 05:34
zombix:
I don't know much about implementation, however I think that passing through all the files is useless. This code returns false also in case that it's not even a folder plus it stops in three steps at most.
<?php
function is_empty_folder($folder){
$c=0;
if(is_dir($folder) ){
$files = opendir($folder);
while ($file=readdir($files)){
$c++;
if ($c>2)
return false; // dir contains something
}
return true; // empty dir
}
else return false; // not a dir
}
?>
17-Mar-2008 12:14
to check if folder is empty
function is_empty_folder($folder){
$c=0;
if(is_dir($folder) ){
$files = opendir($folder);
while ($file=readdir($files)){$c++;}
if ($c>2){
return false;
}else{
return true;
}
}
}
17-Dec-2007 11:51
One note regarding checking for empty directories :
>>echo (count(glob("$dir/*")) === 0) ? 'Empty' : 'Not empty';
This does not work correctly on Linux.
The '.' and '..' will always be returned even if no files are present in the directory.
05-Dec-2007 02:25
Took a while to figure this out, but - DONT USE THIS IN A LOOP WITH READDIR()! readdir() only gives the file/dir name and not the full path which is_dir apparently needs to be able to accurately evaluate the argument.
29-Jul-2007 11:42
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
18-Jul-2007 02:54
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.
20-May-2007 06:33
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;
}
?>
11-May-2007 06:26
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.
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';
?>
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.
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
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)) {
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...
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.
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.
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..
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 ;)
...
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
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>";
}
}
}
}
?>
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)
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.
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/');
?>
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
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;
}
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;
}
?>
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;
}
?>
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
}
?>
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.
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;
}
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
}
?>
