-1

嗨,我创建了一种使用其扩展名删除所有文件的方法。

这是代码

function RemoveAllFiles($extensions)
{
   foreach($extensions as $extension)
   {
       $files = glob("*.".$extension."");

      foreach($files as $file)
      {
         unlink($file);
      }

    }
 }

我这样打电话

$commonObj =  new CommonUtility();
$extesions = array("zip","xlsx");
$commonObj->RemoveAllFiles($extesions);

如果两个文件都存在,它工作正常,否则我收到此错误

 Warning: Invalid argument supplied for foreach() in CommonUtilities.class.php on line 356

任何帮助,将不胜感激。

4

4 回答 4

1

glob可以返回false错误;此值不是有效的主题,foreach并且会导致您提到的警告。

此外,当它不匹配任何文件时,即使一切正常,glob也可能返回:false

笔记:

在某些系统上,无法区分空匹配和错误。

为了保护自己,只需foreach使用过滤掉false值的条件来保护,例如:

 $files = glob("*.".$extension."");
 if (!$files) {
     continue; // do nothing if error or no files match
 }

 foreach($files as $file)
 {
     unlink($file);
 }
于 2013-02-14T11:19:35.307 回答
1

虽然它得到了类似的回答:

function removeAllFiles(array $extensions) {
    foreach(array_filter($extensions) as $extension) {
        $files = glob("*.{$extension}");
        if (is_array($files) {
            foreach($files as $file) {
                unlink($file);
            }
        }
    }
}    

参数上的类型提示将第一个与同一问题array隔离开来。foreach同样,is_array($files)第二个绝缘。count($files)没有必要,因为foreach给定一个空数组,将跳过第二个块。

array_filter($extensions)将删除“虚假”值,包括falsenull"",这些值可能需要防止"*."被传递给glob. 不过,您可能想省略这一点,因为我不记得是否"0"会被过滤快速测试显示"0"将被过滤,以及"false"),这将过滤掉 " *.0" 作为掩码 - 一个完全有效的扩展。

removeAllFiles(["foo"]);                // no problem

removeAllFiles(["foo", "bar"]);         // also no problem

removeAllFiles("foo");                  // problem! has to be an array

removeAllFiles([false, null, ""]);      // no problem, but no action; filtered

removeAllFiles([false, null, "foo"]);   // no problem, only "foo"
于 2013-02-14T12:07:43.917 回答
0

试试下面的代码

function RemoveAllFiles($extensions)
{
    foreach($extensions as $extension)
    {
        $files = glob("*.".$extension."");

        usort($files, function($a, $b) { return filemtime($a) - filemtime($b); });

        array_pop($files);

        array_map('unlink', $files);

    }
}

$commonObj =  new CommonUtility();

$extesions = array("zip","xlsx");

$commonObj->RemoveAllFiles($extesions);
于 2013-02-14T11:22:12.857 回答
0
if(is_array($files)){
      foreach($files as $file)
      {
         unlink($file);
      }
}

它检查是否$files是数组,否则不执行 foreach

于 2013-02-14T11:25:49.973 回答