2013-02-14 77 views
-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); 

其工作正常,如果有两个文件都存在,否则我得到这个错误

任何帮助,将不胜感激。

+2

如果使用(is_array($文件)&&计数($文件)> 0){的foreach()...} – 2013-02-14 11:17:14

+0

任何一个可以告诉为什么下投票..? – Rakesh 2013-02-14 11:59:45

+0

此外,您应该键入提示参数为'array $ extensions'以确保数组已被传递,或者将参数类型转换为'foreach((array)$ extensions as $ extension)',它将包装非数组数组中的原始值。 – Dan 2013-02-14 12:00:39

回答

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); 
} 
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); 
+0

这应该做什么? – Jon 2013-02-14 11:23:08

0
if(is_array($files)){ 
     foreach($files as $file) 
     { 
     unlink($file); 
     } 
} 

它检查是否$files是其他数组不执行foreach

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)将删除 “falsey” 值,包括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" 
+0

我只是试过只计数.. – Rakesh 2013-02-14 12:10:32

+0

@Vijesh'count(false)'实际产生'1'。这可能会导致问题。 – Dan 2013-02-14 12:12:05