2010-11-17 126 views
98

我正在尋找一個循環遍歷目錄中的所有文件的PHP腳本,以便我可以使用文件名(例如格式,打印或將其添加到鏈接)進行操作。我希望能夠按名稱,類型或創建/添加/修改日期對文件進行排序。 (想想fancy directory「index」。)我還想能夠將排除項添加到文件列表中,例如腳本本身或其他「系統」文件。 (如...「目錄」。)PHP腳本循環瀏覽目錄中的所有文件?

因爲我希望能夠修改腳本,所以我更感興趣的是查看PHP文檔並學習如何自己寫一個。也就是說,如果有任何現有的腳本,教程和whatnot,請讓我知道。

+0

http://stackoverflow.com/questions/1086105/ get-the-files-inside-a-directory/1086110#1086110 – zloctb 2015-10-28 12:05:40

回答

185

可以使用DirectoryIterator。來自php的示例手冊:

<?php 
$dir = new DirectoryIterator(dirname(__FILE__)); 
foreach ($dir as $fileinfo) { 
    if (!$fileinfo->isDot()) { 
     var_dump($fileinfo->getFilename()); 
    } 
} 
?> 
+3

注意:許多服務器沒有安裝SPL,因此您將無法使用Di rectoryIterator類(請參閱下面的我的替代帖子)。如果你可以的話,使用這個! – NexusRex 2011-04-11 23:23:29

+1

注意[2]:確保你明白上面的''dirname()''函數將得到你放在那裏的任何路徑的父文件夾。在我的情況下,我認爲dirname是目錄名稱/路徑的包裝,所以它不是必需的。 – willdanceforfun 2016-03-03 11:38:50

+0

另外,如果dirname是大文件系統,則內存問題很明顯。在我的情況下,有1個文件,應用程序需要memory_limit約512M內存。 – abkrim 2016-11-22 08:30:27

14

使用scandir()功能:

<?php 
    $directory = '/path/to/files'; 

    if (! is_dir($directory)) { 
     exit('Invalid diretory path'); 
    } 

    $files = array(); 

    foreach (scandir($directory) as $file) { 
     if ('.' === $file) continue; 
     if ('..' === $file) continue; 

     $files[] = $file; 
    } 

    var_dump($files); 
?> 
2

glob()有關於排序和模式匹配的規定。由於返回值是一個數組,所以你可以完成你需要的大部分任務。

+1

你正在處理大量的文件...> 10,000。你會用完內存。 – NexusRex 2011-04-11 23:21:45

+0

@NexusRex:你不應該從數據庫中讀取10,000條記錄,但是就問題而言,這超出了範圍 – stillstanding 2011-04-12 02:25:00

+0

同意!如果從數據庫中讀取數據,則可以使用「限制」進行分頁 - 但是,如果您有一個包含500萬個XML文件的目錄可以迭代,那麼不會有這樣的運氣。 – NexusRex 2011-04-12 05:15:45

34

如果您沒有訪問DirectoryIterator類試試這個:

<?php 
$path = "/path/to/files"; 

if ($handle = opendir($path)) { 
    while (false !== ($file = readdir($handle))) { 
     if ('.' === $file) continue; 
     if ('..' === $file) continue; 

     // do something with the file 
    } 
    closedir($handle); 
} 
?> 
+3

你能說出你無法訪問的情況嗎? – 2013-12-29 01:40:33

+9

許多遺留應用程序使用PHP 4,它無法訪問DirectoryIterator。 – 2014-03-20 14:02:52

+1

爲什麼'。' === $文件?這不是Java。 – 2017-08-07 20:01:10

6

您也可以使用FilesystemIterator。它需要更少的代碼,然後DirectoryIterator,並自動刪除...

$fileSystemIterator = new FilesystemIterator('images'); 

$entries = array(); 
foreach ($fileSystemIterator as $fileInfo){ 
    $entries[] = $fileInfo->getFilename(); 
} 

var_dump($entries); 

//OUTPUT 
object(FilesystemIterator)[1] 

array (size=14) 
    0 => string 'aa[1].jpg' (length=9) 
    1 => string 'Chrysanthemum.jpg' (length=17) 
    2 => string 'Desert.jpg' (length=10) 
    3 => string 'giphy_billclinton_sad.gif' (length=25) 
    4 => string 'giphy_shut_your.gif' (length=19) 
    5 => string 'Hydrangeas.jpg' (length=14) 
    6 => string 'Jellyfish.jpg' (length=13) 
    7 => string 'Koala.jpg' (length=9) 
    8 => string 'Lighthouse.jpg' (length=14) 
    9 => string 'Penguins.jpg' (length=12) 
    10 => string 'pnggrad16rgb.png' (length=16) 
    11 => string 'pnggrad16rgba.png' (length=17) 
    12 => string 'pnggradHDrgba.png' (length=17) 
    13 => string 'Tulips.jpg' (length=10) 

鏈接: http://php.net/manual/en/class.filesystemiterator.php

0

您可以使用此代碼迴路thorugh目錄recusivly

$path = "/home/myhome"; 
$rdi = new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::KEY_AS_PATHNAME); 
foreach (new RecursiveIteratorIterator($rdi, RecursiveIteratorIterator::SELF_FIRST) as $file => $info) { 
    echo $file."\n"; 
} 
5
$files = glob('folder/*.{jpg,png,gif}', GLOB_BRACE); 

foreach($files as $file) 
{  
    //do your work here  
} 
+0

喜歡這個解決方案。這是否也會查找嵌套文件,或者僅查找指定目錄中的文件? – 2018-02-01 21:20:06

+0

只有當前目錄Joe。 – 2018-02-10 11:43:32

相關問題