2009-12-17 45 views
6

如何自動刪除x時間後的子目錄下的所有文件(比如24小時後) - 不使用服務器或pl的cronjob命令。你怎麼能這樣做只是使用PHP代碼,或者只需訪問該頁面而不點擊某些內容並且命令自動運行。x時間後自動刪除所有文件

回答

11

響應。我將編寫代碼示例,因此我創建了另一個答案,而不是另外添加一條評論。

要刪除自定義擴展名的文件,你必須實現代碼:

<?php 
    $path = dirname(__FILE__).'/files'; 
    if ($handle = opendir($path)) { 

    while (false !== ($file = readdir($handle))) { 
     if ((time()-filectime($path.'/'.$file)) < 86400) { // 86400 = 60*60*24 
      if (preg_match('/\.txt$/i', $file)) { 
      unlink($path.'/'.$file); 
      } 
     } 
    } 
    } 
?> 

評論:1。本例使用正則表達式/\.txt$/i,這意味着,只有具有擴展名的文件txt將被刪除。 '$'符號表示該文件名必須以字符串'.txt'結尾。標誌'我'表示,該比較將不區分大小寫。更多關於preg_match()的功能。

此外,您可以使用strripos()函數搜索具有特定擴展名的文件。下面是代碼片段:

<?php 
    $path = dirname(__FILE__).'/files'; 
    if ($handle = opendir($path)) { 

    while (false !== ($file = readdir($handle))) { 
     if ((time()-filectime($path.'/'.$file)) < 86400) { // 86400 = 60*60*24 
      if (strripos($file, '.txt') !== false) { 
      unlink($path.'/'.$file); 
      } 
     } 
    } 
    } 
?> 

評論:這個例子似乎更明顯。 strripos()的結果也可以通過兩個函數的組合來實現:strrpos(strtolower($file), '.txt'),但是,恕我直言,在您的代碼中使用較少的函數使它更具可讀性和更小是一個很好的規則。請仔細閱讀strripos()函數頁面上的警告(返回值塊)。

另一個重要提示:如果您使用的是UNIX系統,文件刪除可能會因文件權限而失敗。您可以查看有關chmod()功能的手冊。

祝你好運。

+2

而不是readdir + preg_match爲什麼不簡單地使用glob()? – 2009-12-21 08:43:32

+0

你是對的。我沒有寫關於glob()的函數,因爲我從來沒有使用它。:)謝謝你的評論。 – Alex 2009-12-21 09:14:24

+0

非常感謝Alex和Thankyou – jones 2009-12-23 02:35:57

7

您可以使用PHP核心功能filectime()unlink()來檢查文件創建時間並刪除其文件/文件。

編輯。 代碼示例:從我的第一個回答的最後一點

if ($handle = opendir('/path/to/files')) { 

    while (false !== ($file = readdir($handle))) { 
     if (filectime($file)< (time()-86400)) { // 86400 = 60*60*24 
      unlink($file); 
     } 
    } 
    } 
+0

它只是函數的骨架。您可以添加任何條件,例如文件與自定義擴展名或文件,匹配某些模式等 – Alex 2009-12-17 12:49:30

+0

謝謝亞歷克斯....我希望這項工作.. – jones 2009-12-18 20:39:51

+0

不客氣。我很樂意幫助你。如果這個答案適合你,你可以通過點擊我答案附近的勾號來接受它。 – Alex 2009-12-18 21:57:19

0

我使用shell AT命令,它就像一個cronjob雖然

PHP:

exec("echo rm /somedir/somefile.ext|at now +24 hours"); 
0

下面是一個使用GLOB另一個例子,它會刪除任何文件

$files = glob('path/to/your/files/*'); 

foreach($files as $file) { // iterate files 
    // if file creation time is more than 5 minutes 
    if ((time() - filectime($file)) > 3600) { // 86400 = 60*60*24 
     unlink($file); 
    } 
} 

,或者你想排除某些文件

$files = preg_grep('#\.txt#', glob('/path/to/your/files/*'), PREG_GREP_INVERT); 
2

那麼我們來看看刪除X天數的文件的PHP腳本。

<? 
$days = 1; 
$dir = dirname (__FILE__); 

$nofiles = 0; 

    if ($handle = opendir($dir)) { 
    while (($file = readdir($handle)) !== false) { 
     if ($file == '.' || $file == '..' || is_dir($dir.'/'.$file)) { 
      continue; 
     } 

     if ((time() - filemtime($dir.'/'.$file)) > ($days *86400)) { 
      $nofiles++; 
      unlink($dir.'/'.$file); 
     } 
    } 
    closedir($handle); 
    echo "Total files deleted: $nofiles \n"; 
} 
?> 

現在粘貼此代碼並將其保存爲php文件,將其上傳到您要刪除文件的文件夾。您可以在這個PHP代碼

$days = 1; 

,如果你將它設置爲2,那麼文件早於2天將被刪除,設置的天數,例如一開始看到的。基本上,這是該文件的條目是發生了什麼,當你運行該腳本,獲取當前目錄,讀取文件條目,跳過「」對於當前目錄,並進一步檢查是否有任何其他目錄,

if ($file == '.' || $file == '..' || is_dir($dir.'/'.$file)) { 
      continue; 
} 

不是一個目錄,然後它獲取文件的修改時間(最後修改時間),並進行比較,如果是天

if ((time() - filemtime($dir.'/'.$file)) > ($days *86400)) { 
      $nofiles++; 
      unlink($dir.'/'.$file); 
} 

如果條件爲真則刪除該文件,取消鏈接的幫助數()PHP功能。最後關閉目錄並退出。我還添加了一個計數器來計算正在刪除的文件數量,這些文件將在刪除過程結束時顯示。因此,將php文件放在需要刪除文件的目錄中並執行它。

希望幫助:)

0
function deleteCachedData($hours=24) 
{ 
    $files = glob(ROOTDIR.DIRECTORY_SEPARATOR.'tmp'.DIRECTORY_SEPARATOR.'*.txt'); 
    foreach($files as $file) { 
     if(is_file($file) && (time() - filectime($file)) > $hours*3600) { 
      unlink($file); 
     } 
    } 

}

0

試圖用這些例子後,我打了幾個問題:

  1. 比較運營商應大於,不小於
  2. filemtime返回修改的時間。 filectime是文件inode數據更改的時間;即,當權限,擁有者,組,或從inode其他元數據被更新時,這可能會導致意想不到的結果

我改爲使用filemtime的例子和固定的比較如下:

<?php 
    $path = dirname(__FILE__).'/files'; 
    if ($handle = opendir($path)) { 

    while (false !== ($file = readdir($handle))) { 
     if ((time()-filemtime($path.'/'.$file)) > 86400) { // 86400 = 60*60*24 
      if (preg_match('/\.txt$/i', $file)) { 
      unlink($path.'/'.$file); 
      } 
     } 
    } 
    } 
?>