Souci filectime en code php

Ola!

Je suis en train de me faire un scénario avec un bloc code
Je vous passe l’usine que je fais mais je bute sur un souci que je ne comprends pas

if (is_dir("$chemin") )
  {
   $handle=opendir($chemin);
   while (false!==($file = readdir($handle))) {
       if ($file != "." && $file != ".." && $file = $filetype) { 
           $diff = (time()-filectime("$chemin/$file"))/86400;
           $scenario->setLog('| Fichier trouvé     : ' . $file);
           $scenario->setLog('| Diff               : ' . $diff);
           //if ($diff > $nbjour) unlink("$path/$file");
       }
   }
   closedir($handle);
}

$diff = (time()-filectime("$chemin/$file"))/86400; pour avoir un nombre de jours
et le comparer if ($Diff > $nbjour)

sauf que $diff ne me renvoie pas un nombre de jours

si vous voyez mon erreur

:pray: :pray:

Plutôt comme ça :

$diff=date_diff(time(),filectime('$chemin/$file'))->format('%a') ;

Date_diff pour faire la différence entre 2 dates et avoir un intervalle
format(’%a’) pour l’afficher en nb de jours.

https://www.php.net/manual/en/datetime.diff.php

Norbert

Bonjour,
Ca dépend des flags de montage du disque dans fstab.
Voir: https://community.jeedom.com/t/fonction-du-core-qui-fait-le-menage-dans-les-plugins-preinstallupdate-postinstallupdate/28611/27?u=jpty

Sur la Smart avec le flag de montage du disque noatime, fileatime et filectime ne sont pas corrects.
Exemple pour le fichier boot.ini, j’ai ce résultat:

Fonction     Date                        Commande unix équivalente
fileatime(): 2022-05-30T15:13:30+02:00   ls -lu
filemtime(): 2020-11-12T15:35:08+01:00   ls -l
filectime(): 2023-04-25T03:16:53+02:00   ls -lc

A toi d’appeler la bonne fonction.

PS: En lisant le titre et les notes de la doc php de la fonction filectime, ce n’est pas la date de création du fichier mais la date de dernière modification de son inode qui est renvoyée.

Tu m’as perdu…
Je veux juste pour effacer des fichiers plus vieux de x jours…

Et le lien que tu me donnes ne fonctionne pas pour moi

Utilise filemtime qui est le seul avec une info correcte.
filectime, c’est l’inode du fichier.
fileatime ne fonctionne pas sur la Smart à cause du flag noatime dans le mount du disque.

C’était un lien vers un salon dev ou l’on parlait de -mtime et -atime sur la Smart.

Je teste des que je peux… la je suis sur tel dans un fourgon…

Sinon, tu peux aussi le faire avec la commande find.
Lors de l’install d’un plugin, le core nettoie tous les fichiers qui ont plus de 7 jours avec cette commande:

shell_exec('find ' . __DIR__ . '/../' . $folder . '/* -mtime +7 -type f ! -iname "custom.*" ! -iname "common.config.php" -delete');

Merci ngrataloup,

mais je viens de tester ```
$diff=date_diff(time(),filectime(’$chemin/$file’))->format(’%a’) ;

ca donne : Diff               : 19473.213587963

19473 jours = 53,3 ans … Soit le nb de jour depuis le 01/01/1970 … Ce qui me fait dire que ta commande filectime(’$chemin/$file’) doit renvoyer 0
Donc, soit elle ne marche pas, soit, le fichier en question n’est pas présent
Que donne :

date("F d Y H:i:s.", filectime('$chemin/$file'));

Norbert

Je viens de faire quelques tests, c’ets pas si obvious car date_diff demande des objets date et time et filectime donnent des timestamp …

Autre remarque, comme dit par @jpty, filectime n’ets pas pertinent car il correspond à la derniere modif des inode. ce qui est notamment le cas lorsqu’il y a changement de droits … et une routine passe toutes les nuits sur Jeedom d’équerre. Il faut donc privilégier filemtime.
Du coup, ca donne

$dateFic = DateTime::createFromFormat('U',filemtime('$chemin/$file'));
$diff = date_diff($dateFic,date_create())->format('%a');
$scenario->setLog('now : '.date_create()->format('r').' --> fichier : '.$dateFic->format('r').' --> diff : '.$diff.' jours');
Norbert

Bonjour,

$diff = (time()-filemtime("$chemin/$file"))/86400;

va le faire directement time et filemtime retournent des timestamps.

D’autre part, ce n’est pas très propre de détruire des fichiers (unlink) dans la liste des fichiers que l’on est en train de parcourir avec readdir. En C, ça crashe.

Il faut parcourir les fichiers et mémoriser ceux que l’on veut détruire dans un tableau.
Puis parcourir le tableau pour supprimer les fichiers.

Pour le code du 1er post, ça donnerait:

if (is_dir($chemin) ) {
  $handle=opendir($chemin);
  if($handle !== false) {
    $files = array();
    while (($file = readdir($handle)) !== false) {
      if ($file != "." && $file != "..") { 
        $diff = (time()-filemtime("$chemin/$file"))/86400;
        if ($diff > $nbjour) {
          $files[] = "$chemin/$file";
          // $scenario->setLog('| Fichier à supprimer     : ' . $file);
          // $scenario->setLog('| Diff               : ' . $diff);
        }
      }
    }
    closedir($handle);
    foreach($files as $file) {
      // unlink($file);
    }
  }
}

J’ai enlevé && $file = $filetype dans le code parce qu’avec un seul = ce n’est pas un test et que je ne sais pas ce qu’est $filetype.
Si c’est le type de fichier qui doit être un fichier ‹ normal ›, le test pourrait alors être:

if (filetype("$chemin/$file") == 'file' )

à la place de

if ($file != "." && $file != "..")

Pas besoin de tester si le nom est . ou .. ce sont des répertoires.

On sent les pros du PHP et les autres. Je garde ce bout de code sous le coude ! :clap: :+1:

1 « J'aime »

Ola,

désolé pour le retour tardif, j’ai été pris…

Merci pour ce code corrigé.

en fait && $file = $filetype
C’est un paramètre qui représente *.jpg ou *.mov, bref le type de fichiers que je souhaite effacer

Car le but de ce script est effacer un type de fichier précisé et selon un age vis a vis de la date du jour

Oui j’essaye de me former en ecrivant des blocs code pour faire des trucs concret mais bon je debute et je crois que je vais rester debutant.

En l’état le scritp fonctionne grace JPTY :pray: :pray:
Mais je ne vois pas comment filtrer sur des ficheirs *.mob ou *.jpg que je passe en parametre via mon scénario dans $filestype car si je rajoute cela, ca ne fonctionne plus

Un grand merci à toi ! :pray: :pray: :beers: :beers:

J’ai finalisé mon usine à gaz lol
Bon j’ai mis du log plus qu’il n’en faut c’est pour tester et être sûr avant de passer à la vraie phase de delete !

Mais à l’exécution j’ai bien tout ce que je veux et mes différents cas bien traités