2010-11-12 132 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