Filemtime "не удалось выполнить" - программирование
Подтвердить что ты не робот

Filemtime "не удалось выполнить"

Я уже прочитал столько вопросов и ответов об этом, но я не могу решить свою проблему...

Я пытаюсь создать функцию, которая удаляет все файлы с расширением "xml" или "xsl", которое было создано один день назад. Но я получаю это предупреждение в каждом файле, который у меня есть:

Предупреждение: filemtime() [function.filemtime]: stat failed для post_1003463425.xml в /home/u 188867248/public_html/ampc/library.php в строке 44

Все файлы этого каталога имеют одно и то же имя структуры "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); 
    }
}

Спасибо за вашу помощь:)

4b9b3361

Ответ 1

Я думаю, что проблема - это реальная траектория файла. Например, ваш script работает над './', ваш файл находится внутри каталога './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); 
    }
  }

Ответ 2

Для меня имя файла было добавлено с помощью строки запроса, которая не понравилась этой функции.

$path = 'path/to/my/file.js?v=2'

Решением было сначала отрубить это:

$path = preg_replace('/\?v=[\d]+$/', '', $path);
$fileTime = filemtime($path);

Ответ 3

Укороченная версия для тех, кто любит короткий код:

// 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);

    }

}