我已经阅读了很多关于它的问题和答案,但我仍然无法解决我的问题......
我正在尝试创建一个函数,删除前一天创建的“xml”或“xsl”扩展名的所有文件。但我在每个文件上收到此警告:
警告:filemtime()[function.filemtime]:第44行/home/u188867248/public_html/ampc/library.php中post_1003463425.xml的stat失败
此目录的所有文件具有相同的结构名称“post_ + randomNum + .xml”(例如:post_1003463425.xml或post_1456463425.xsl)。所以我认为这不是编码问题(就像我在其他问题中看到的那样)。
我的功能代码是:
function deleteOldFiles(){
if ($handle = opendir('./xml')) {
while (false !== ($file = readdir($handle))) {
if(preg_match("/^.*\.(xml|xsl)$/i", $file)){
$filelastmodified = filemtime($file);
if ( (time()-$filelastmodified ) > 24*3600){
unlink($file);
}
}
}
closedir($handle);
}
}
感谢您的帮助:)
答案 0 :(得分:29)
我认为问题是文件的真实路径。例如,您的脚本正在处理“./”,您的文件位于“./xml”目录中。因此,在获得filemtime或取消链接之前,请更好地检查文件是否存在:
function deleteOldFiles(){
if ($handle = opendir('./xml')) {
while (false !== ($file = readdir($handle))) {
if(preg_match("/^.*\.(xml|xsl)$/i", $file)){
$fpath = 'xml/'.$file;
if (file_exists($fpath)) {
$filelastmodified = filemtime($fpath);
if ( (time() - $filelastmodified ) > 24*3600){
unlink($fpath);
}
}
}
}
closedir($handle);
}
}
答案 1 :(得分:1)
与路径或文件名无关。如果filemtime(),fileatime()或filectime()不起作用,请尝试stat()。
$filedate = date_create(date("Y-m-d", filectime($file)));
成为
$stat = stat($directory.$file);
$filedate = date_create(date("Y-m-d", $stat['ctime']));
对我有用。
用于按天数删除文件的完整代码段:
$directory = $_SERVER['DOCUMENT_ROOT'].'/directory/';
$files = array_slice(scandir($directory), 2);
foreach($files as $file)
{
$extension = substr($file, -3, 3);
if ($extension == 'jpg') // in case you only want specific files deleted
{
$stat = stat($directory.$file);
$filedate = date_create(date("Y-m-d", $stat['ctime']));
$today = date_create(date("Y-m-d"));
$days = date_diff($filedate, $today, true);
if ($days->days > 1)
{
unlink($directory.$file);
}
}
}
答案 2 :(得分:0)
对我而言,所涉及的文件名后面附加了查询字符串,此功能不希望这样做。
$path = 'path/to/my/file.js?v=2'
解决方案是先将其切碎:
$path = preg_replace('/\?v=[\d]+$/', '', $path);
$fileTime = filemtime($path);
答案 3 :(得分:0)
喜欢短代码的人的短版:
// usage: deleteOldFiles("./xml", "xml,xsl", 24 * 3600)
function deleteOldFiles($dir, $patterns = "*", int $timeout = 3600) {
// $dir is directory, $patterns is file types e.g. "txt,xls", $timeout is max age
foreach (glob($dir."/*"."{{$patterns}}",GLOB_BRACE) as $f) {
if (is_writable($f) && filemtime($f) < (time() - $timeout))
unlink($f);
}
}