2013-02-24 93 views
2

我正在测试目录处理的功能。我有一个折叠/目录包含以下内容:php readdir和is_dir

0文件夹

假文件夹

my_pictures文件夹

MVI_3094 MOV文件

IMG01 JPEG图像

etc ...

我写了下面的代码来遍历目录,并打印出具体resutls

$handle = opendir("files/"); 
while(($entry = readdir($handle)) !== false) 
{ 
    if($entry == "." || $entry == "..") 
    { 
     continue; 
    } 
    if(is_dir($entry)) 
    { 
     echo "Directory:$entry<br />"; 
    } 
} 

我唯一的问题是,第二个“如果”语句做的

echo "Directory:$entry<br />"; 

即使进入不输出结果是一个目录。我使用“var_dump”函数手动检查了条目,并将其作为目录返回true。

任何建议将有助于

回答

6

试试这个,并检查。只是一个尝试...

$handle = opendir("files/"); 
while(($entry = readdir($handle)) !== false) 
{ 
    if($entry == "." || $entry == "..") 
    { 
     continue; 
    } 
    elseif(is_dir("files/".$entry)) 
    { 
     echo "Directory:$entry<br />"; 
    } 
} 
+0

同样的结果如上。 – 2013-02-24 00:49:29

+0

@robertrocha现在尝试上面的代码?更新它。 – 2013-02-24 00:51:09

+1

作品。但我仍然试图弄清楚为什么它需要这样的逻辑。 – 2013-02-24 01:01:56

1

$ entry is relative ... is_dir expect a absolute path。

+0

您的回答有效。但在手册中没有提及它需要一个绝对路径。它只说明“文件的路径。如果filename是一个相对文件名,它将被检查相对于当前工作目录。 “我手动检查这个值:var_dump(is_dir($ entry)),它返回true – 2013-02-24 00:57:32

+0

chdir()函数将改变PHP中的当前目录,否则它不会被readdir改变 – 2013-02-24 01:03:00

0

这只是探测任何目录项的基本名称:

is_dir($entry) 

的执行opendir()结果列表将是相对于你给的阅读目录。所以,你需要使用:

is_dir("files/$entry") 
1

尝试:

if(is_dir("files/".$entry)) 

readdir()刚刚返回的文件名。因此,您的代码正在寻找当前目录中的文件而不是子目录。

+0

但是手册状态如果一个文件名是一个目录(通过is_dir),它应该返回true – 2013-02-24 01:14:24

+0

问题在于它是错误的文件名,你关心的文件名是'files/foo',但是'$ entry'只包含'foo'。 – Barmar 2013-02-24 01:27:44

+0

我想现在我明白了,这是因为我使用了返回句柄而不是文件名的opendir函数。 – 2013-02-24 01:55:12

0

尝试使用DirectoryIterator

$iterator = new \DirectoryIterator(realpath('files/')); 

foreach($iterator as $file){ 

    if($file->isDot()) 
    continue; 

    if($file->isDir()) 
    printf('Directory: %s <br/>', $file->getRealPath()); 

} 
0

你的问题是,在elseif(is_dir($entry)) {entry等于像“file.txt的”或“somedirectory”,这是不是指向文件的路径一些字符串在所有。它需要是“files/file.txt”。

试试这个:

$dir = "files/"; 
$handle = opendir($dir); 
while(($entry = readdir($handle)) !== false) 
{ 
    if($entry == "." || $entry == "..") 
    { 
     continue; 
    } 
    if(is_dir($dir.$entry)) 
    { 
     echo "Directory:$entry<br />"; 
    } 
}