2

アップロードフォルダー内のファイルを検査するメソッドを作成していますが、これらのファイルの一部はアーカイブ ( tar、tar.gz、zip、rar など) です。これらのアーカイブ ファイルを読み取り、すべてのファイルをネストされたツリー形式で一覧表示したいと考えています。

たとえば、 というアーカイブ ファイルがありsandwich.tar.gz、次のようにリストしたいと考えています:-

sandwich.tar.gz
    lettuce
    mayonaise
    cheese
    bread (directory)
        wholemeal

これまでの私のコード:-

<?php $archive = new PharData('/upload/directory/sandwich.tar.gz');
foreach($archive as $file) {
        echo $file . "<br />";
}

breadしかし、ディレクトリ内のファイルを一覧表示できませんでした。これを修正するにはどうすればよいですか?

4

3 に答える 3

5

を使用してこれを行うことができます。これは、クラスを拡張し、クラスがクラスを拡張するRecursiveIteratorIteratorためです。PharDataPharPharRecursiveDirectoryIterator

$archive = new PharData('/upload/directory/sandwich.tar.gz');

foreach (new RecursiveIteratorIterator($archive) as $file) {
    echo $file . "<br />";
}
于 2018-01-23T16:13:09.843 に答える
2

この質問はかなり時代遅れですが、以前の回答の愚かさと役に立たないことを考えると、返信せざるを得ません。

PHP が行うことは、常に非標準であり、せいぜい扱いにくいようです...

最初のレベルを調べるのは正解です。ただし、反復から返されたオブジェクトは同じ型ではないため、foreachそれらを呼び出すと失敗します。

オブジェクトを反復すると、PharDataオブジェクトが得られますPharFileInfo。そこから、ファイルの種類を確認できます (継承されたisDir()メソッドを持つディレクトリであるかどうかを確認します)。

そこから、(これも継承された) メソッドから取得したリソースへのパスに別の PharData オブジェクトを作成する必要がありますgetPathname()( sic、ドキュメントとは言いませgetPathName()ん!)。その後、それを繰り返すことができます...

完全な例:

<?php
    $archive = new PharData('/upload/directory/sandwich.tar.gz');
    foreach($archive as $file) {
        echo $file;
        if($file->isDir()) {
            echo ':';
            $dir = new PharData($file->getPathname());
            foreach($dir as $child) {
                echo "<br />$child";
            }
        }
        echo "<br />";
    }
?>

もちろん、アーカイブに複数のレベルがある場合、簡単な再帰が殺されます。独自の再帰クローラーを作成する必要があります...

于 2016-01-11T11:09:02.730 に答える
-3

私が一度与えられ、頻繁に考えているアドバイスが頭に浮かびます。コードは、要求されたことを正確に実行します。それ以上でもそれ以下でもありません。

マシンに尋ねます:「これがディレクトリの場合は、内容を表示してください?」

関数は $file を探していると考え、そのファイルの名前を出力します。

http://php.net/manual/en/function.readdir.phphttp://www.php.net/manual/en/function.is-dir.phpを検討してください

于 2013-05-13T03:17:03.650 に答える