web-dev-qa-db-ja.com

filemtime "warning stat failed for"

私はすでにそれについて非常に多くの質問と回答を読みましたが、まだ私の問題を解決することはできません...

1日前に作成された「xml」または「xsl」拡張子を持つすべてのファイルを削除する関数を作成しようとしています。しかし、私は持っている各ファイルでこの警告を受け取っています:

警告:filemtime()[function.filemtime]:44行目の/home/u188867248/public_html/ampc/library.phpのpost_1003463425.xmlの統計が失敗しました

このディレクトリのすべてのファイルは、同じ構造名「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); 
    }
}

ご協力いただきありがとうございます :)

21
Gerard Brull

問題はファイルの実パスだと思います。たとえば、スクリプトが「./」で動作している場合、ファイルはディレクトリ「./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); 
    }
  }
29
Somy A

私にとっては、関連するファイル名にクエリ文字列が追加されていましたが、この関数は気に入らなかったのです。

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

解決策は、最初にそれを切り落とすことでした:

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

短いコードが好きな人のための短いバージョン:

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

    }

}
0
lufc