【问题标题】:How to find larges file in a directory tree, in php?如何在 php 中找到目录树中最大的文件?
【发布时间】:2023-03-16 14:55:02
【问题描述】:

我有一个文件夹,其中包含其他文件夹,这些文件夹可能包含也可能不包含文件可能驻留的其他文件夹。我想扫描整个 dir 结构,找到大于 100MB 的文件,并将这些文件移动到顶级目录。

用 php 有什么好的方法来完成这个?

例如:

/data/1/subfolder/id33/big_file.avi
/data/4/another_big_file.avi
/data/56/something/big_file2.avi

我需要将这 3 个文件移动到 /data

【问题讨论】:

    标签: php move


    【解决方案1】:

    只需扫描所有子文件夹

    $it = new RecursiveDirectoryIterator("/data");
    foreach(new RecursiveIteratorIterator($it) as $file) {
        //work with file (which is simplya a path here actually) here
    }
    

    你会在那里添加一些条件,例如

    if (filesize($file) > 100e6) {
        rename($file, '/data/filename...');
    }
    

    【讨论】:

      【解决方案2】:
      class MyFilterIterator extends FilterIterator {
          public function accept() {
              return $this->getSize() > 100*1024*1024;
          }
      }
      
      $it = new MyFilterIterator(new RecursiveIteratorIterator(
          new RecursiveDirectoryIterator("/data")));
      
      foreach($it as $file) {
          //move ...
      }
      

      【讨论】:

      • 代替filesize(parent::current()),使用$this->getSize() 或更少magic$this->current()->getSize() 或最后,如果你真的必须使用parent::current()->getSize() 怎么样?跨度>
      • 一旦我尝试排除较小的文件,它就会停止读取较低的目录 9即使它们有足够大的文件)
      • @sal wow $this->getSize() 病得很重。我很好奇它是如何工作的,神奇的是在“双迭代器”(封装其他迭代器的迭代器)的 get_method 处理程序中:svn.php.net/viewvc/php/php-src/branches/PHP_5_3/ext/spl/…
      【解决方案3】:

      如果您使用 SPL 中的 DirectoryIterator 浏览目录,甚至在需要时递归到该目录。要进行下一步,您可以使用过滤器按文件大小过滤结果,然后执行您需要的操作。

      这是一个粗略的例子:http://www.phpro.org/tutorials/Introduction-to-SPL-DirectoryIterator.html#17

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-13
        • 2012-02-13
        • 2012-01-31
        • 1970-01-01
        • 1970-01-01
        • 2012-04-23
        • 2015-09-22
        相关资源
        最近更新 更多