如何自動刪除x時間後的子目錄下的所有文件(比如24小時後) - 不使用服務器或pl的cronjob命令。你怎麼能這樣做只是使用PHP代碼,或者只需訪問該頁面而不點擊某些內容並且命令自動運行。x時間後自動刪除所有文件
回答
響應。我將編寫代碼示例,因此我創建了另一個答案,而不是另外添加一條評論。
要刪除自定義擴展名的文件,你必須實現代碼:
<?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()功能的手冊。
祝你好運。
您可以使用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);
}
}
}
我使用shell AT命令,它就像一個cronjob雖然
PHP:
exec("echo rm /somedir/somefile.ext|at now +24 hours");
下面是一個使用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);
那麼我們來看看刪除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文件放在需要刪除文件的目錄中並執行它。
希望幫助:)
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);
}
}
}
試圖用這些例子後,我打了幾個問題:
- 比較運營商應大於,不小於
- 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);
}
}
}
}
?>
- 1. 在Coldfusion中x時間後自動更新或刪除記錄
- 2. 刪除文件夾內的所有文件,但刪除最後?
- 3. 上傳後自動刪除文件
- 4. 保留x個文件並刪除所有其他文件 - Powershell
- 5. Codeigniter:刪除所有文件後刪除目錄
- 6. 在x天后自動刪除所有作者和他們的帖子
- 7. 自動刪除臨時文件
- 8. PHP自動刪除文件定時器
- 9. Ruby自動刪除臨時文件?
- 10. Java臨時文件和自動刪除
- 11. 自動刪除臨時文件(C#)
- 12. NSHomeDirectory刪除所有文件
- 13. 刪除所有.ica文件
- 14. x天后刪除日誌文件
- 15. PHP自動刪除文件鏈接刪除後?
- 16. 高圖表 - 刪除自動縮小x軸的時間範圍
- 17. 刪除文本文件中的所有空間與Python 3.x的
- 18. 自動刪除已刪除文件夾中的所有Outlook日曆項目
- 19. git:僅在主分支中刪除文件 - 所有時間
- 20. 自動刪除目錄中的所有文件?
- 21. 自注冊後根據時間自動刪除Wordpress用戶?
- 22. MongoDB自動刪除文件
- 23. 自動刪除AF_UNIX文件?
- 24. 24小時後自動刪除文件和包含文件的文件夾
- 25. 刪除除X以外的所有文件夾最近的文件夾
- 26. SQL Server:自動刪除所有條目
- 27. 讀取後從文件中刪除所有文件
- 28. java.util.logging在tomcat啓動時刪除所有日誌文件
- 29. 刪除所有通過修訂版X添加的文件
- 30. Ansible,刪除X最新文件夾以外的所有內容
而不是readdir + preg_match爲什麼不簡單地使用glob()? – 2009-12-21 08:43:32
你是對的。我沒有寫關於glob()的函數,因爲我從來沒有使用它。:)謝謝你的評論。 – Alex 2009-12-21 09:14:24
非常感謝Alex和Thankyou – jones 2009-12-23 02:35:57