【问题标题】:Return total number of files within a folder using PHP使用 PHP 返回文件夹中的文件总数
【发布时间】:2010-09-18 11:21:29
【问题描述】:

有没有更好/更简单的方法来查找目录中的图像数量并将它们输出到变量?

function dirCount($dir) {
  $x = 0;
  while (($file = readdir($dir)) !== false) {
    if (isImage($file)) {$x = $x + 1}
  }
  return $x;
}

这似乎是一个很长的路要走,没有更简单的方法吗?

注意:如果文件是图像,isImage() 函数返回 true。

【问题讨论】:

    标签: php file count directory


    【解决方案1】:

    查看 DirectoryIterator 的标准 PHP 库(又名 SPL):

    $dir = new DirectoryIterator('/path/to/dir');
    foreach($dir as $file ){
      $x += (isImage($file)) ? 1 : 0;
    }
    

    (仅供参考,有一个名为 iterator_count() 的未记录函数,但我想现在最好不要依赖它。而且你需要过滤掉看不见的东西,比如 . 和 .. 无论如何。)

    【讨论】:

    • 这就是我要发布的内容。我认为您的解决方案是可行的方法。
    • 太棒了!正是我想要的!
    【解决方案2】:

    这将为您提供目录中的内容的计数。我将把关于只计算图像的部分留给你,因为我即将跌倒aaasssllleeelppppppzzzzzzzzzzzzzzz。

    iterator_count(new DirectoryIterator('path/to/dir/'));
    

    【讨论】:

      【解决方案3】:

      我是这样做的:

      $files = scandir($dir);
      $x = count($files);
      echo $x;
      

      但它也计算 .和..

      【讨论】:

      • 它还检索文件夹,据我所知,您应该遍历$files 数组并使用is_file 检查它是否是一个文件。
      【解决方案4】:

      上述代码

      $count = count(glob("*.{jpg,png,gif,bmp}"));
      

      是你最好的,但 {jpg,png,gif} 位只有在你在末尾附加 GLOB_BRACE 标志时才有效:

      $count = count(glob("*.{jpg,png,gif,bmp}", GLOB_BRACE));
      

      【讨论】:

        【解决方案5】:

        你可以使用glob...

        $count = 0;
        foreach (glob("*.*") as $file) {
            if (isImage($file)) ++$count;
        }
        

        或者,我不确定这是否能满足您的需求,但您可以这样做:

        $count = count(glob("*.{jpg,png,gif,bmp}"));
        

        【讨论】:

          【解决方案6】:

          您还可以通过扩展抽象 FilterIterator 类,使用您的 isImage 函数利用 SPL 过滤 DirectoryIterator 的内容。

          class ImageIterator extends FilterIterator {
          
              public function __construct($path)
              {
                  parent::__construct(new DirectoryIterator($path));
              }
          
              public function accept()
              {
                  return isImage($this->getInnerIterator());
              }
          }
          

          然后您可以使用iterator_count(或实现Countable 接口并使用本机count 函数)来确定图像的数量。例如:

          $images = new ImageIterator('/path/to/images');
          printf('Found %d images!', iterator_count($images));
          

          使用这种方法,根据您需要如何使用此代码,将isImage 函数移动到ImageIterator 类中以将所有内容整齐地打包在一个地方可能更有意义。

          【讨论】:

            【解决方案7】:

            我使用以下方法来获取 Laravel 中一个目录中所有类型文件的计数

               $dir = public_path('img/');
                $files = glob($dir . '*.*');
            
                if ( $files !== false )
                {
                    $total_count = count( $files );
                    return $totalCount;
                }
                else
                {
                    return 0;
                }
            

            【讨论】:

              【解决方案8】:

              您的答案似乎很简单。我想不出在 PHP 或 Perl 中更短的方法。

              如果您使用的是 Linux,则可能可以使用涉及 ls、wc 和 grep 的 system / exec 命令,具体取决于 isImage() 的复杂程度。

              无论如何,我认为你所拥有的已经足够了。您只需编写一次函数。

              【讨论】:

              • 我尽量避免使用 System 和 Exec(安全第一!),但我会牢记这一点。
              • 如果您发现您的 isImage() 函数和当前方法很慢,我认为执行 ls 并将其传送到 wc -l 可能会更快。不过,如果您当前的方法很慢,我只会这样做,因为您对不使用 system/exec 的安全原因是正确的。
              【解决方案9】:

              我使用它来返回目录中除 .和..

              return count(glob("/path/to/file/[!\.]*"));
              

              这里是a good list of glob filters,用于文件匹配。

              【讨论】:

                【解决方案10】:
                $nfiles = glob("/path/to/file/[!\\.]*");
                
                if ($nfiles !== FALSE){
                
                    return count($nfiles);
                
                } else {
                
                    return 0;
                
                }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-01-08
                  • 2017-08-02
                  • 2017-12-25
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-09-27
                  相关资源
                  最近更新 更多