2013-12-23 85 views
0

按照php.net手冊中的註釋給出的示例,我試圖在遞歸目錄結構中獲取每個名爲file.txt的文件。獲取遞歸目錄中的特定文件

Folder/ 
    subfold1 
    subfold2 
    file.txt 

    subfold3 
    file.txt 

等等是文件夾結構如何看起來像一個例子。

$directory = new \RecursiveDirectoryIterator(__DIR__ . '/..'); 

    $iterator = new \RecursiveIteratorIterator($directory); 

    $files = new \RegexIterator($iterator, '/^file.txt$/', \RecursiveRegexIterator::GET_MATCH); 

    var_dump($files); 

的問題是,給定的代碼是給下面的結果:

object(RegexIterator)#4 (1) { ["replacement"]=> NULL } 

我應該怎麼做呢?我只是在尋找文件和給定的路徑,最好是在一個數組中。

回答

3

您一般希望迭代通過*Iterator對象,最經常使用基本的foreach()循環。

foreach ($files as $file) { 
    // Do something 
} 

在你的情況,這項工作是一個更多地參與,因爲您正在使用此刻的代碼將永遠不會返回任何匹配的文件進行迭代。首先,讓我們看看應該起什麼作用。

$directory = new RecursiveDirectoryIterator(
    __DIR__ . '/..', 
    RecursiveDirectoryIterator::KEY_AS_FILENAME | 
    RecursiveDirectoryIterator::CURRENT_AS_FILEINFO 
); 
$files = new RegexIterator(
    new RecursiveIteratorIterator($directory), 
    '#^file\.txt$#', 
    RegexIterator::MATCH, 
    RegexIterator::USE_KEY 
); 

關鍵帶回家的變化是:

  • RecursiveDirectoryIterator::KEY_AS_FILENAME標誌爲RecursiveDirectoryIterator,結合使用
  • RegexIterator::USE_KEY標誌的RegexIterator`

此前,當迭代器被迭代時,正則表達式將匹配「當前」迭代器值,在你的情況下它是一個SplFileInfo代表每個文件的對象。當轉換爲字符串時,爲使正則表達式匹配,SplFileInfo對象被轉換爲完整路徑;目錄和所有。這意味着你的正則表達式永遠不會匹配,因爲它只是期待文件名。

長話短說,KEY_AS_FILENAMEUSE_KEY標誌意味着正則表達式只處理每個文件的文件名。好極了!

您可能還注意到,我在RegexIterator::MATCH模式下使用了RegexIterator。這意味着在循環匹配的文件時,我們可以完全訪問每個SplFileInfo對象。這給了我們更多的玩法,而不僅僅是一個文件名爲RegexIterator::GET_MATCH的字符串。

要打印出每個文件,用自己完整路徑,你可以使用類似:

foreach ($files as $file) { 
    echo $file->getPathname() . "\n"; 
} 

SplFileInfo documentation的可用方法的完整列表。

相關問題