2012-11-18 86 views
0

我不得不列出目錄中的所有文件和文件夾:目錄迭代和遞歸目錄迭代器

  $images = array(); 
      $dirs = array(); 

      $dir = new DirectoryIterator($upload_dir_real); 

      foreach ($dir as $file) { 
       if ($file->isDot()) { 
        continue; 
       } 

       if ($file->isDir()) { 
        // dir 
        $scanned_dirs[] = $file->getPath(); 
         continue; 
       } else { 
        // file 

        //echo $file->getFilename() . "<br>\n";//DEBUG 
        $realfile = $file->getFilename() . "<br>\n"; 
        $realpath = $file->getPathname(); 
        echo realpath($realfile);//DEBUG 
        $file->getFilename(); 
        $images[] = realpath($realpath); 
       } 

      } 

這工作正常(沒有錯誤),但當然只計算了根,所以我嘗試遞歸:

  $images = array(); 
      $dirs = array(); 
$dir = new RecursiveDirectoryIterator($upload_dir_real); 

      foreach ($dir as $file) { 
       if ($file->isDot()) { 
        continue; 
       } 

       if ($file->isDir()) { 
        // dir 
        $scanned_dirs[] = $file->getsubPath(); 
         continue; 
       } else { 
        // file 

        //echo $file->getFilename() . "<br>\n"; //DEBUG 
        $realfile = $file->getsubFilename() . "<br>\n"; 
        $realpath = $file->getsubPathname(); 
        echo realpath($realfile);//DEBUG 
        $file->getFilename(); 
        $images[] = realpath($realpath); 
       } 

      } 

基本上,我改變了getPath();getsubPath()(和等價物)。問題是,它給我一個錯誤:

Fatal error: Call to undefined method SplFileInfo::isDot() in blah blah path

所以我搜索了一會兒,發現這一點:

Why does isDot() fail on me? (PHP)

這基本上是同樣的問題,但是當我嘗試,我得到這個錯誤:

Fatal error: Class 'FilesystemIterator' not found in in blah blah path

問題:

1 - 爲什麼是方法在其他接受的答案中描述不適合我? 2 - 在同一個答案,什麼是下面的代碼:

new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator(
    $pathToFolder, 
    FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_SELF)); 

這實際上是調用RecursiveIteratorIterator兩次?我的意思是,如果它是遞歸的,它不能遞歸兩次:-)

2b - 如何找到FilesystemIterator未找到,即使PHP手冊狀態(據我瞭解),它是遞歸的一部分迭代器是建立在?

(這些問題是因爲我想更好地理解,而不是僅僅複製和粘貼答案)。

3 - 是否有更好的方式來列出跨平臺的所有文件夾和文件?

+1

'FilesystemIterator'在PHP 5.3引入的,API文檔只是代表基於它的'RecursiveDirectoryIterator'的當前狀態。在你最後的片段中,你沒有使用RII兩次,你有一個RII和一個RDI。 – mario

+0

您使用的是什麼版本的PHP – Baba

+0

ooh ..我錯過了RII和RDI--謝謝,(PHP版本也解釋了 - 我使用5.2.9),但仍然 - 我怎樣才能使用is_dot或等價的?如何使這個功能起作用? –

回答

4
  • 1 - 爲什麼在其他公認的答案不是爲我工作中描述的方法??`

至於我可以告訴。代碼工作完美,但你的實現是錯誤的,你正在使用以下

代碼

$dir = new RecursiveDirectoryIterator($upload_dir_real); 

而不是

$dir = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($upload_dir_real)); 
  • 在這相同的答案實際上是調用RecursiveIteratorIterator兩次?我的意思是,如果是遞歸的,它不能是遞歸的兩倍... :-))

不,它不需要它的不同

RecursiveIteratorIterator != RecursiveDirectoryIterator != FilesystemIterator 
      ^       ^     
  • 怎麼來FilesystemIterator沒有找到,甚至如果PHP手冊說明(據我的理解)它是遞歸迭代器構建的部分?

你已經回答了你在你的評論正在使用PHP版本5.2.9自其不再支持或推薦

  • 3 - 有沒有更好的辦法來列出所有文件夾和文件跨平臺? ?

,因爲這是解決所有你需要的是FilesystemIterator::SKIP_DOTS你不必調用$file->isDot()

$fullPath = __DIR__; 
$dirs = $files = array(); 

$directory = new RecursiveDirectoryIterator($fullPath, FilesystemIterator::SKIP_DOTS); 
foreach (new RecursiveIteratorIterator($directory, RecursiveIteratorIterator::SELF_FIRST) as $path) { 
    $path->isDir() ? $dirs[] = $path->__toString() : $files[] = realpath($path->__toString()); 
} 

var_dump($files, $dirs); 
+0

好 - 謝謝(再次... :-))但它給了我同樣的錯誤'致命的錯誤:類'FilesystemIterator'未找到' - 是否有其他一些方法,我可以用來避免我的PHP版本相同的錯誤? ? –

+0

只是一個快速的問題..你爲什麼仍然使用不再支持的PHP版本,它是'5.2.9' – Baba

+0

好 - 沒有好的答案 - 我的本地DEV服務器就是這樣。我從來沒有任何問題(我是一個新手),但也許是時候升級我的技能和我的服務器一次... –