2013-10-16 24 views
0

哪種方法或其他方法最適合顯示文件?
注意:在這個例子中,我只對顯示文件名感興趣

另外,FilesystemIterator中的項目如何排序?

以下三個示例都顯示相同的結果,但FilesystemIterator沒有明顯的排序順序。exec()vs glob()vs FilesystemIterator()

$path = "/"; 
exec("ls $path", $results); 
foreach($results as $file){ 
    p($file); 
} 

foreach(glob($path."/*") as $file){ 
    p(basename($file) ); 
} 

foreach(new FilesystemIterator($path) as $file){ 
    p($file->getFilename()); 
} 


function p($s){ 
    global $path; 
    echo "<a href=\"$path?f=$s\">$s</a><BR>\n"; 
} 

輸出:

exec("ls ...") method 
bin 
boot 
cdrom 
dev 
etc 
home 
initrd.img 
... 


glob() method 
bin 
boot 
cdrom 
dev 
etc 
home 
initrd.img 
... 


FilesystemIterator() method 
mnt 
vmlinuz 
cdrom 
usr 
sys 
home 
var 
... 

回答

0

我不知道對你給的方法的優點和缺點,但是PHP併爲您提供了一組函數來處理目錄。

http://www.php.net/manual/en/ref.dir.php

快速樣品:

$dh = opendir("path/to/folder"); 
while (($file = readdir($dh)) !== false) { 
    // filename will be in $file, will include "." and ".." 
} 
+0

這與FilesystemIterator的輸出完全相同,只不過有點 – ElefantPhace

+1

它不是,FilesystemIterator返回SplFileObject的集合 – apocalypz

+0

至於輸出**只有**文件名,正如我所做的那樣,沒有什麼不同 – ElefantPhace

0

每當你問「最好的」,你需要定義的標準,所以你的主要問題不能回答。

的一些注意事項,但:

  • 關於迭代器的順序,我想,它根本不以任何方式對文件進行排序,但它們提供了在它們被存儲在磁盤上的方式。這可能是相同的opendir()/ readdir()(是否有一個closedir()在PHP中,btw?)正在做。不對它進行排序是有道理的:無論如何,當你要用不同的屬性重新排序或者根本不需要它時,你不會浪費CPU週期。
  • 關於第一個(exec(..)),創建一個新的進程(這很昂貴),運行一個程序(甚至不存在於每個系統上,但只有POSIX風格的程序),然後返回輸出作爲一個單一的字符串,你需要解析以獲得單個文件。此外,直接ls將自行過濾隱藏的文件。
  • 使用通配符進行Globbing也相當昂貴,特別是如果您根本不想過濾事物。

我會默認使用一個目錄迭代器,根據需要對它進行排序,除非有一些要求(那些你還沒有提到的)告訴別的。

+0

用exec()如果提供了arg2/$ output,給定的數組將被命令的每一行輸出填充,這就是我正在做的 – ElefantPhace

1

如何:

EXEC() - 是最糟糕的解決方案,因爲它在你的應用程序中創建potentional安全漏洞,如果用戶能夠管理進入EXEC輸入參數自定義字符串。出於這個原因,大多數託管阻止您使用exec,所以如果您將應用程序部署到某個您不屬於您的應用程序,則可以阻止此命令。

glob(),opendir/readdir解決方案與FilesystemIterator相同。這是在你身上,你會選擇什麼。優點和缺點如下:

函數,比如glob,opendir/readdir消耗更少的內存,因爲沒有創建對象,您可以簡單地獲取一個字符串值數組。如果您確定的話,這可能很好,您只需要在文件系統中列出路徑。

FilesystemIterator爲您提供了SplFileInfo對象的集合,這些對象爲每個項目提供了一整套方法,比如getExtension,getFullPath,getFilename,這使得使用文件/文件夾執行一些高級任務變得相當容易。

Ps .:所以在可用性方面最好的是通過FilesystemIterator的OOP方法,因爲您可以獲得對象,這些對象可以保存或可以獲取關於目標文件/文件夾的許多信息,就簡單性而言,您可以選擇調用函數,例如glob

+1

我也沒有詢問涉及exec()的安全問題 – ElefantPhace

+1

I只是認爲這將是很好的提及他們... – apocalypz

+1

如果你打算給一個合格的定義「最好」,你會得到更好的答案... –

相關問題