0

ディレクトリ内のすべてのファイルとフォルダを一覧表示する必要がありました。

            $images = array();
            $dirs   = array();

            $dir = new DirectoryIterator($upload_dir_real);

             foreach ($dir as $file) {
               if ($file->isDot()) {
                    continue;
                }

                if ($file->isDir()) {
                    // dir
                    $scanned_dirs[] = $file->getPath();
                      continue;
                } else {
                    // file

                    //echo $file->getFilename() . "<br>\n";//DEBUG
                    $realfile =  $file->getFilename() . "<br>\n";
                    $realpath = $file->getPathname();
                    echo realpath($realfile);//DEBUG
                    $file->getFilename();
                    $images[] = realpath( $realpath );
                }

             }

これは正常に機能します(エラーはありません)が、もちろんルートのみをカウントしたので、再帰的に試しました:

            $images = array();
            $dirs   = array();
$dir = new RecursiveDirectoryIterator($upload_dir_real);

             foreach ($dir as $file) {
               if ($file->isDot()) {
                    continue;
                }

                if ($file->isDir()) {
                    // dir
                    $scanned_dirs[] = $file->getsubPath();
                      continue;
                } else {
                    // file

                    //echo $file->getFilename() . "<br>\n"; //DEBUG
                    $realfile =  $file->getsubFilename() . "<br>\n";
                    $realpath = $file->getsubPathname();
                    echo realpath($realfile);//DEBUG
                    $file->getFilename();
                    $images[] = realpath( $realpath );
                }

             }

基本的に、getPath();with getsubPath()(および同等のもの)を変更しました。問題は、エラーが発生することです。

Fatal error: Call to undefined method SplFileInfo::isDot() in blah blah path

しばらく検索して、これを見つけました:

isDot()が失敗するのはなぜですか?(PHP)

これは基本的に同じ問題ですが、試してみると、次のエラーが発生します。

Fatal error: Class 'FilesystemIterator' not found in in blah blah path

質問:

1-他の受け入れられた回答に記載されている方法がうまくいかないのはなぜですか?2-同じ答えで、次のコードは何ですか:

new RecursiveIteratorIterator(
  new RecursiveDirectoryIterator(
    $pathToFolder,
    FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_SELF));

これは実際にRecursiveIteratorIterator2回呼び出しますか?つまり、再帰的である場合、2回再帰的にすることはできません:-)

2b- FilesystemIteratorPHPのマニュアルに(私の理解では)再帰的イテレータが構築されているものの一部であると記載されていても、どうして見つからないのですか?

(これらの質問は、回答をコピーして貼り付けるだけでなく、理解を深めたいためです)。

3-すべてのフォルダとファイルをクロスプラットフォームで一覧表示するためのより良い方法はありますか?

4

2 に答える 2

6
  • 1-他の受け入れられた回答に記載されている方法が私のために機能しないのはなぜですか??`

私の知る限り 。コードは完全に機能しますが、以下を使用している実装が間違っています

コード

   $dir = new RecursiveDirectoryIterator($upload_dir_real);

それ以外の

    $dir = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($upload_dir_real));
  • その同じ答えで実際にRecursiveIteratorIteratorを2回呼び出しますか?つまり、再帰的である場合、2回再帰的にすることはできません... :-))

いいえ、違いはありません

RecursiveIteratorIterator != RecursiveDirectoryIterator != FilesystemIterator
            ^                             ^                    
  • phpマニュアルに(私の理解では)再帰的イテレータが構築されているものの一部であると記載されていても、FilesystemIteratorが見つからないのはなぜですか?

あなたはすでにあなたのコメントであなたが5.2.9もはやサポートされていないか推奨されていないPHPバージョンを使用しているとあなた自身が答えました

  • 3-すべてのフォルダとファイルをクロスプラットフォームで一覧表示するためのより良い方法はありますか?

それが解決されたので、必要なのはFilesystemIterator::SKIP_DOTS電話する必要がないことだけです$file->isDot()

$fullPath = __DIR__;
$dirs = $files = array();

$directory = new RecursiveDirectoryIterator($fullPath, FilesystemIterator::SKIP_DOTS);
foreach (new RecursiveIteratorIterator($directory, RecursiveIteratorIterator::SELF_FIRST) as $path ) {
    $path->isDir() ? $dirs[] = $path->__toString() : $files[] = realpath($path->__toString());
}

var_dump($files, $dirs);
于 2012-11-18T21:33:04.017 に答える
1

これは、以下を利用した別の方法ですsetFlags

<?php

$o_dir = new RecursiveDirectoryIterator('.');
$o_dir->setFlags(RecursiveDirectoryIterator::SKIP_DOTS);
$o_iter = new RecursiveIteratorIterator($o_dir);

foreach ($o_iter as $o_info) {
   echo $o_info->getPathname(), "\n";
}

https://php.net/filesystemiterator.setflags

于 2020-08-28T23:30:40.970 に答える