2010-11-12 133 views
0

为什么PHP读取目录时输出两个子目录:...子目录“。”和“..”| PHP

从PHP.net:

<?php 
$dir = "/etc/php5/"; 

// Open a known directory, and proceed to read its contents 
if (is_dir($dir)) { 
    if ($dh = opendir($dir)) { 
     while (($file = readdir($dh)) !== false) { 
      echo "filename: $file : filetype: " . filetype($dir . $file) . "\n"; 
     } 
     closedir($dh); 
    } 
} 
?> 

输出:

filename: . : filetype: dir 
filename: .. : filetype: dir 
filename: apache : filetype: dir 
filename: cgi : filetype: dir 
filename: cli : filetype: dir 

为什么会这样?

+0

这是在* nix世界的正常现象 – sbczk 2010-11-12 16:37:38

+1

您可能想查看['DirectoryIterator'](http://us.php.net/manual/en/class.directoryiterator.php)而不是'readdir' .. 。它甚至有一个'$ file-> isDot()'方法来检测这个东西... – ircmaxell 2010-11-12 16:50:18

回答

10

因为“。”和“..”是实际的目录(在* nix世界中)。

“。”指当前目录
“..”是指父目录。

如果您执行“ls”,您将看到相同的确切输出。

+0

啊,我看到...解释它,我想知道他们是否隐藏,没有人可能能够隐藏的文件夹看到:P谢谢。 – MacMac 2010-11-12 16:38:09

+0

隐藏的目录以“。”开头。但包含其他字符。例如“.mozilla”和“.emacs” – mote 2010-11-12 16:39:12

+1

并在Windows世界以及... – ircmaxell 2010-11-12 16:42:03

2

...是符号链接到当前和父目录,它们存在于大多数文件系统,所以如果你不希望这些对你的代码的目录列表显示,试试这个:

$skipped = array('.', '..'); 
while (($file = readdir($dh)) !== false) { 
    if(in_array($file, $skipped)) continue; 
    echo "filename: $file : filetype: " . filetype($dir . $file) . "\n"; 
} 
closedir($dh); 
0

如果您不需要...条目,请改为使用​​3210。

+0

*(tipp)* [PHPArchitect比尔卡尔文把glob添加到测试](http://www.phparch.com/2010/04/28 /外放水珠到的检验) – Gordon 2010-11-12 17:05:49