webentwicklung-frage-antwort-db.com.de

dateizeit "Warnstat fehlgeschlagen für"

Ich habe schon so viele Fragen und Antworten darüber gelesen, aber ich kann mein Problem nicht lösen ...

Ich versuche, eine Funktion zu erstellen, die alle Dateien mit der Erweiterung "xml" oder "xsl" löscht, die vor einem Tag erstellt wurde. Ich bekomme diese Warnung jedoch für jede Datei, die ich habe:

Warnung: filemtime () [function.filemtime]: stat für post_1003463425.xml in /home/u188867248/public_html/ampc/library.php in Zeile 44 fehlgeschlagen

Alle Dateien dieses Verzeichnisses haben den gleichen Strukturnamen "post_ + randomNum + .xml" (Beispiel: post_1003463425.xml oder post_1456463425.xsl). Ich denke, es ist kein verschlüsseltes Problem (wie ich in anderen Fragen gesehen habe).

Der Code meiner Funktion lautet:

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

Danke für Ihre Hilfe :)

21
Gerard Brull

Ich denke, das Problem ist der Realpfad der Datei. Beispielsweise arbeitet Ihr Skript unter './', Ihre Datei befindet sich im Verzeichnis './xml'. Prüfen Sie also besser, ob die Datei existiert oder nicht, bevor Sie die Dateimoduszeit ermitteln oder die Verknüpfung aufheben:

  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

Für mich wurde der Dateiname mit einer Querzeichenfolge versehen, die dieser Funktion nicht gefiel.

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

Die Lösung bestand darin, das zuerst abzuschneiden:

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

Kürzere Version für diejenigen, die Kurzcode mögen:

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