好吧,我終於找到了一個解決這個PHP在處理Windows上的符號鏈接的bug。使用opendir()
遞歸迭代文件/目錄時會發生該錯誤。如果當前目錄中存在某個目錄的符號鏈接,則opendir()
將無法讀取目錄符號鏈接中的目錄。這是由於php的statcache中有些東西造成的,可以通過調用clearstatcache()
來解決,然後在目錄符號鏈接上調用opendir()
(同時父目錄的文件句柄必須關閉)。
下面是修復的一個例子:
<?php
class Filesystem
{
public static function files($path, $stats = FALSE)
{
clearstatcache();
$ret = array();
$handle = opendir($path);
$files = array();
// Store files in directory, subdirectories can't be read until current handle is closed & statcache cleared.
while (FALSE !== ($file = readdir($handle)))
{
if ($file != '.' && $file != '..')
{
$files[] = $file;
}
}
// Handle _must_ be closed before statcache is cleared, cache from open handles won't be cleared!
closedir($handle);
foreach ($files as $file)
{
clearstatcache($path);
if (is_dir($path . '/' . $file))
{
$dir_files = self::files($path . '/' . $file);
foreach ($dir_files as $dir_file)
{
$ret[] = $file . '/' . $dir_file;
}
}
else if (is_file($path . '/' . $file))
{
$ret[] = $file;
}
}
return $ret;
}
}
var_dump(filessystem::files('c:\\some_path'));
編輯:看來clearstatcache($path)
前必須對symlink'd目錄的任何文件處理函數被調用。 Php沒有正確緩存符號鏈接的dirs。
它在資源管理器中工作,但是iis_user有權限查看它嗎? – 2010-05-25 18:16:40
@丹Thx!但我運行Apache(XAMPP LAMP堆棧),它似乎是一個PHP的opendir()的錯誤。我發現了一個可以追溯到2008年的PHP bug報告,這個報告在5.3中沒有被修復:/。 – 2010-05-25 20:56:40