©
This document uses PHP Chinese website manual Release
(PHP 4, PHP 5, PHP 7)
is_dir — 判断给定文件名是否是一个目录
$filename
)判断给定文件名是否是一个目录。
filename
如果文件名存在并且为目录则返回 TRUE
。如果 filename
是一个相对路径,则按照当前工作目录检查其相对路径。
If filename
is a symbolic or hard link
then the link will be resolved and checked. If you have enabled 安全模式,
or open_basedir further
restrictions may apply.
如果文件名存在,并且是个目录,返回 TRUE
,否则返回 FALSE
。
Example #1 is_dir() 例子
<?php
var_dump ( is_dir ( 'a_file.txt' ));
var_dump ( is_dir ( 'bogus_dir/abc' ));
var_dump ( is_dir ( '..' )); //one dir up
?>
以上例程会输出:
bool(false) bool(false) bool(true)
失败时抛出 E_WARNING
警告。
Note: 此函数的结果会被缓存。参见 clearstatcache() 以获得更多细节。
自 PHP 5.0.0 起, 此函数也用于某些 URL 包装器。请参见 支持的协议和封装协议以获得支持 stat() 系列函数功能的包装器列表。
[#1] thomas at thomasnoest dot nl [2015-11-15 23:39:12]
Note that on Linux is_dir returns FALSE if a parent directory does not have +x (executable) set for the php process.
[#2] jonlulf at gmail dot com [2015-09-18 14:26:36]
My solution to the problem that you must include the full path to make "is_dir" work properly as a complete example:
<?php // findfiles.php - what is in directory "videoarchive"
$dir = 'images/videoarchive/'; // path from top
$files = scandir($dir);
$files_n = count($files);
$i=0;
while($i<=$files_n){
// "is_dir" only works from top directory, so append the $dir before the file
if (is_dir($dir.'/'.$files[$i])){
$MyFileType[$i] = "D" ; // D for Directory
} else{
$MyFileType[$i] = "F" ; // F for File
}
// print itemNo, itemType(D/F) and itemname
echo '<br>'.$i.'. '. $MyFileType[$i].'. ' .$files[$i] ;
$i++;
}
?>
[#3] niceuser at live dot com [2013-04-10 19:20:06]
PITFALL in sub dir processing
After struggeling with a sub-dir processing (some subdirs were skipped) AND reading the posts, I realized that virutally no-one clearly told what were wrong.
The common traverse dir code was:
-----------------------------------------
opendir("myphotos"); // Top dir to process from (example)
while (false !== ($fname = readdir($h_dir))) { // process current dir (read a directory entry)
if ($fname{0} == '.') continue; // skip dirs . and .. by first char test
if (is_dir($fname)) call_own_subdir_process; // process this subdir by calling a routine
}
PROBLEM IS :
The "is_dir()" must have the FULL PATH or it will skip some dirs. So the above code need to INSERT THE PATH before the filename. This would give this change in above...
if (is_dir("myphotos\" . $fname)) call_own_subdir_process; // skip subdirs
The pitfall really was, that without full path some subdirs were found...hope this clears all up
[#4] Victor [2013-03-13 03:37:55]
If you are using Mac, or others systems that store information about the directory layout and etc, the function:
function empty_dir($dir) {
if (($files = @scandir($dir)) && count($files) <= 3)
return true;
else
return false;
}
Must have the count($files) comparing with the number of hidden files!
For example, I'm using Mac and the empty directory shows me three files: ".", ".." and ".DS_Store", so if I am planning to put the website online on my Mac, I've to count in the ".DS_Store" file!
[#5] digitalaudiorock at gmail dot com [2010-06-09 12:48:00]
Just a note for anyone who encounters is_dir() returning false on CIFS mount points or directories within those mount points on 2.6.31 and newer kernels: Apparently in new kernels they've started using the CIFS serverino option by default. With Windows shares this causes huge inode numbers and which apparently can cause is_dir() to return false. Adding the noserverino option to the CIFS mount will prevent this. This may only occur on 32 systems but I don't have a 64 bit install to test against.
[#6] vstoykov at consultant dot bg [2009-04-23 03:43:33]
When trying (no 'pear') to enumerate mounted drives on a win32 platform (Win XP SP3, Apache/2.2.11, PHP/5.2.9), I used:
<?php
function echo_win_drives() {
for($c='A'; $c<='Z'; $c++)
if(is_dir($c . ':'))
echo $c . ': ';
}
?>
which yielded:
A: C: D: E: F: G: H: I:
[#7] alanguir at detroitchamber dot com [2009-01-28 09:02:40]
When I run a scandir I always run a simple filter to account for file system artifacts (especially from a simple ftp folder drop) and the "." ".." that shows up in every directory:
<?php
if (is_dir($folder){
$contents = scandir($folder);
$bad = array(".", "..", ".DS_Store", "_notes", "Thumbs.db");
$files = array_diff($contents, $bad);
}
?>
[#8] Btx [2008-09-26 03:03:33]
<?php
public static function isEmptyDir($dir){
return (($files = @scandir($dir)) && count($files) <= 2);
}
?>
better ;)
[#9] jasoneisen at gee mail [2008-08-29 08:53:35]
An even better (PHP 5 only) alternative to "Davy Defaud's function":
<?php
function is_empty_dir($dir)
{
if (($files = @scandir($dir)) && count($files) <= 2) {
return true;
}
return false;
}
?>
NOTE: you should obviously be checking beforehand if $dir is actually a directory, and that it is readable, as only relying on this you would assume that in both cases you have a non-empty readable directory.
[#10] Anonymous [2007-12-17 23:51:46]
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.
[#11] danr at cvisual dot com dot com [2007-07-18 14:54:14]
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.
[#12] gecko4 at gmail dot com [2007-02-24 21:03:29]
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';
?>
[#13] Eric [2006-10-24 13:53:01]
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
[#14] puremango dot co dot uk at gmail dot com [2005-02-08 11:55:23]
this function bypasses open_basedir restrictions.
<?php
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:
<?php
....
echo is_dir("/somewhere/i/dont/have/access/to");
?>
output:
Warning: open_basedir restriction in effect
<?php
....
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
[#15] [2005-02-02 16:12:10]
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;
}
[#16] tibard at gmail dot com [2005-02-01 12:32:02]
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;
}
?>
[#17] sly at noiretblanc dot org [2004-05-28 10:10:34]
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.