0

これらの方法のうち、ファイルを表示するのに最適な方法はどれですか?
注:この例では、ファイル名の表示のみに関心があります。

また、項目はどのようにFilesystemIterator並べ替えられていますか? 次の 3 つの例は、明確な並べ替え順序がない

ことを除いて、どちらも同じ結果を示しています。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
...
4

3 に答える 3

1

これはどう :

exec() - ユーザーが exec 入力パラメーターにカスタム文字列を入力できる場合、アプリケーションに潜在的なセキュリティ ホールが作成されるため、考えられる最悪のソリューションです。このため、ほとんどのホスティングでは exec を使用できないため、所有していないホスティングにアプリをデプロイする場合は、このコマンドをブロックできます。

glob()、opendir/readdir ソリューションは、FilesystemIterator と同じように問題ありません。これはあなた次第です、あなたは何を選びますか。長所と短所は次のとおりです。

glob、opendir/readdir などの関数は、オブジェクトが作成されないため、メモリの消費量が少なく、文字列値の配列を簡単に取得できます。必要なのはファイルシステム内のパスのリストだけであると確信している場合、これは良いことです。

FilesystemIterator は、getExtension、getFullPath、getFilename など、すべてのアイテムに一連のメソッドを提供する SplFileInfo オブジェクトのコレクションを提供します。これにより、ファイル/フォルダーでいくつかの高度なタスクを非常に簡単に実行できます。

Ps .: 使いやすさの点で最も優れているのは、FilesystemIterator を介した OOP アプローチです。これは、オブジェクトを取得するか、ターゲット ファイル/フォルダーに関する多くの情報を保持または取得できるためです。シンプルさの点で、glob などの呼び出し関数を選択できます。

于 2013-10-16T06:05:13.897 に答える
0

「最高」を求めるときはいつでも、基準を定義する必要があるため、主な質問に答えることはできません.

ただし、いくつかの注意事項:

  • イテレータの順序に関しては、ファイルをソートするのではなく、ディスクに保存されている方法で配信すると思います。これはおそらく、opendir()/readdir() (PHP に closedir() はありますか?) が行っていることと同じです。ソートしないのは理にかなっています。とにかく別の属性で再度ソートする場合、またはソートする必要がない場合は、CPU サイクルを無駄にしません。
  • 最初の (exec(..)) に関しては、新しいプロセス (コストがかかる) を作成し、プログラム (すべてのシステムに存在するわけではなく、POSIX スタイルのシステムにのみ存在する) を実行し、出力を単一として返します。単一のファイルを取得するために解析する必要がある文字列。さらに、straightlsは隠しファイルをすべて単独で除外します。
  • ワイルドカードを使用したグロビングもかなりコストがかかります。特に、物事をまったくフィルタリングしたくない場合はなおさらです。

デフォルトでディレクトリイテレータを使用し、必要に応じて並べ替えます。ただし、要件 (まだ言及していない要件) で特に指定されていない場合は除きます。

于 2013-10-16T05:56:18.270 に答える
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 ".."
}
于 2013-10-16T05:39:04.053 に答える