2010-05-25 83 views
0

有誰知道這個問題的解決方案?我無法在符號鏈接的目錄中打開子目錄。我已經確認路徑是正確的(甚至複製&將路徑粘貼到資源管理器中,這可以很好地解析它)。這是一個奇怪的,令人討厭的bug:|。PHP/Windows - Opendir()無法打開符號鏈接目錄中的子目錄

實施例:

C:\文件夾\ symbolic_link \ DIR1 \ DIR2 - 開口DIR2失敗。

C:\文件夾\ symbolic_link \ DIR1 - 工程

C:\文件夾\ real_directory \ DIR1 \ DIR2 - 工程

C:\文件夾\ real_directory \ DIR1 - 工程

+0

它在資源管理器中工作,但是iis_user有權限查看它嗎? – 2010-05-25 18:16:40

+0

@丹Thx!但我運行Apache(XAMPP LAMP堆棧),它似乎是一個PHP的opendir()的錯誤。我發現了一個可以追溯到2008年的PHP bug報告,這個報告在5.3中沒有被修復:/。 – 2010-05-25 20:56:40

回答

0

好吧,我終於找到了一個解決這個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。