2013-02-14 78 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