【问题标题】:Php - Delete files older than 7 days for multiple foldersPhp - 删除多个文件夹超过 7 天的文件
【发布时间】:2021-07-09 10:26:36
【问题描述】:

我想创建一个从多个文件夹/路径中删除文件的 PHP 脚本。 我管理了一些东西,但我想将此代码修改为更具体的文件夹。

这是代码:

<?php
function deleteOlderFiles($path,$days) {
  if ($handle = opendir($path)) {
    while (false !== ($file = readdir($handle))) {
      $filelastmodified = filemtime($path . $file);
      if((time() - $filelastmodified) > $days*24*3600)
      {
        if(is_file($path . $file)) {
          unlink($path . $file);
        }
      }
    }
    closedir($handle);
  }
}

$path = 'C:/Users/Legion/AppData/Local/Temp';
$days = 7;
deleteOlderFiles($path,$days);
?>

我想做一些事情,比如添加更多的路径和这个函数来为每条路径运行。 我尝试添加多个路径位置,但它不起作用,因为它总是采用最后一个 $ 路径变量。 例如:

$path = 'C:/Users/Legion/AppData/Local/Temp';
$path = 'C:/Users/Legion/AppData/Local/Temp/bla';
$path = 'C:/Users/Legion/AppData/Local/Temp/blabla';
$path = 'C:/Users/Legion/AppData/Local/Temp/blalbalba';
$days = 7;
deleteOlderFiles($path,$days);

感谢您的帮助!

【问题讨论】:

  • “因为它总是采用最后一个 $ 路径变量” - 当然是这样,因为您在那里多次覆盖同一个变量。如果已经让你“吃惊”了,那么你或许应该从一个初学者教程开始,先解释一些基础知识?
  • 那你走吧,没必要告诉我们你今天在做什么,但我想你很高兴告诉我们你的计划
  • 你可以把你的路径放到一个array中,然后遍历它。要么在函数外部循环,在循环内部每次调用一条路径 - 要么将数组传递给函数,然后在函数内部循环。
  • @CBroe 我理解并感谢您的帮助。如果不难向我展示我如何做到这一点,您能否请教一下?

标签: php automation path delete-file


【解决方案1】:

简单的解决方案,设置参数后调用函数,而不是将所有可能的参数设置为标量变量。

$days = 7;

$path = 'C:/Users/Legion/AppData/Local/Temp';
deleteOlderFiles($path,$days);

$path = 'C:/Users/Legion/AppData/Local/Temp/bla';
deleteOlderFiles($path,$days);

$path = 'C:/Users/Legion/AppData/Local/Temp/blabla';
deleteOlderFiles($path,$days);

$path = 'C:/Users/Legion/AppData/Local/Temp/blalbalba';
deleteOlderFiles($path,$days);

或者,将目录放在一个数组中,然后从 foreach 循环中调用该函数。

$paths = [];
$paths[] = 'C:/Users/Legion/AppData/Local/Temp';
$paths[] = 'C:/Users/Legion/AppData/Local/Temp/bla';
$paths[] = 'C:/Users/Legion/AppData/Local/Temp/blabla';
$paths[] = 'C:/Users/Legion/AppData/Local/Temp/blalbalba';

$days = 7;

foreach ( $paths as $path){
    deleteOlderFiles($path,$days);
}

【讨论】:

  • 非常感谢@RiggsFolly 的帮助。它就像一个魅力!
【解决方案2】:

您似乎需要一个递归函数,即一个调用自身的函数。在这种情况下,它会在找到要扫描/遍历的子目录时调用自己。

function delete_files($current_path, $days) {
    $files_in_current_path = scandir($current_path);
    foreach($files_in_current_path as $file) {
        if (!in_array($release_file, [".", ".."])) {
            if (is_dir($current_path . "/" . $file)) {
                // Scan found subdirectory
                delete_files($current_path . "/" . $file, $days);
            } else {
                // Here you add your code for checking date and deletion of the $file
               $filelastmodified = filemtime($current_path . "/" . $file);
               if((time() - $filelastmodified) > $days*24*3600) {
                  if(is_file($current_path . "/" . $file)) {
                      unlink($current_path . "/". $file);
                  }
               }
            } 
        }
    }
}
delete_files("your/startpath/here", 7);

此代码从您指定的起始路径开始。它扫描该目录中的所有文件。如果找到子目录,则会对delete_files 进行新调用,但会以该子目录作为开始。

【讨论】:

  • 为了您的帮助@gowrie,我的目标不是搜索每个子文件夹。我的计算机中有一些特定的文件夹,我想运行该功能。这就是为什么我想创建一个数组并在其中添加多个路径,然后每次为每个补丁运行该函数。理论上我知道该怎么做,但实际上我不知道该怎么做。
猜你喜欢
  • 1970-01-01
  • 2016-09-20
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
  • 1970-01-01
相关资源
最近更新 更多