[RESOLU] Ouvrir le dernier fichier (le plus récent) d'un répertoire

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Ouvrir le dernier fichier (le plus récent) d'un répertoire

Re: [RESOLU] Ouvrir le dernier fichier (le plus récent) d'un répertoire

par rmathieu » 20 janv. 2016, 11:39

Merci encore à toi !

Si des conseils ou d'autres remarques, je suis preneur ! :)

Re: Ouvrir le dernier fichier (le plus récent) d'un répertoire

par rmathieu » 20 janv. 2016, 10:42

Ces PHP fonctionnent très bien :
if ($handle = opendir('.')) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            if ($tampon){
                if ( date("YmdHis", filemtime($file)) > date("YmdHis", filemtime($tampon)) ) {
                    $tampon = $file;
                }
            }
            else
            {
                $tampon = $file;
            }
        }
    }
    closedir($handle);
    echo $tampon;
}
if($handle = opendir($path))
{
    while (false !== ($file = readdir($handle)))
    {
        if ($file{0} != '.')
        {
            $list[] = date (filemtime()) . "Le chemin du fichier le plus recent est: " . $path . '/' . $file;
        }
    }

rsort($list);

$new_file = $list[0];

echo $new_file;
Contrairement au PHP Poo...

Re: Ouvrir le dernier fichier (le plus récent) d'un répertoire

par rmathieu » 20 janv. 2016, 10:33

Dans mon cas, il est pas possible que deux fichiers aient la même date et heure, la même date peut être mais heure jamais !

Re: Ouvrir le dernier fichier (le plus récent) d'un répertoire

par rmathieu » 20 janv. 2016, 10:32

Quand je test ton code, il me renvoie le fichier le plus vieux et non pas le plus récent..

Re: Ouvrir le dernier fichier (le plus récent) d'un répertoire

par rmathieu » 20 janv. 2016, 10:29

Bonjour,

Houla.. Je n'ai pas tout compris je pense ..

Re: Ouvrir le dernier fichier (le plus récent) d'un répertoire

par Spols » 20 janv. 2016, 09:40

Je vais argumenter un peu plus mon message précédent.
La fonction filemtime() renvoie une date au format Timestamp Unix.
Pour comparer 2 dates de ce format, je te propose ceci :

Imaginons 2 date telles :
  • 19 Janvier 2016 18h25 & 32s
    14 Janvier 2015 13h32 & 22s
Comment comparer ces 2 dates ? La façon la plus simple pour moi serait de les transformer comme ceci :
Annee/Mois/Jour/Heure/Minute/Seconde
Ça donnerait donc :
  • 19 Janvier 2016 18h25 & 32s --> 2016.01.19.18.25.32
    14 Janvier 2015 13h32 & 22s--> 2015.01.14.13.32.22
Ainsi, 20160119182532 > 20150114133222
Une comparaison en seconde uniquement suffit et est bien plus simple à opèrer. de plus c'est le format de sortie de filemtime()
De plus tu semble ne pas avoir vu qu'il trie sont tableau avant de ne garder que la première instance. C'est certes moins optimisé qu'une variable tampon mais tout aussi efficace pour un nombre réduit de fichier.

Je rajouterai qu'il faudrait une exclusion avec la fonction is_dir dans la boucle, pas besoin de comparer les dossier si seul les fichiers intéresse.
La probabilité que 2 fichiers ai la même date de modification est faible et on en admettant que ce soit les fichiers les plus récent, il faudrait savoir quelle est le comportement souhaité.

Re: Ouvrir le dernier fichier (le plus récent) d'un répertoire

par Aureldunet » 20 janv. 2016, 00:01

N'oublie pas la programmation objet.

Code : Tout sélectionner

ini_set('display_errors', true); function getFileByDate($filename, $recursive = false, $flag = SORT_REGULAR) { if (!is_dir($filename)) { trigger_error("filename '{$filename}' is not a directory."); } $result = array(); foreach (new FilesystemIterator($filename) as $element) { $filename = $element->getFilename(); $realpath = $element->getRealPath(); $timestamp = $element->getCTime(); if ($recursive == true && $element->isDir()) { $result[$timestamp] = getFileByDate($realpath, $recursive); } if ($element->isFile()) { $result[$timestamp] = $realpath; } } sort($result, $flag); return $result; } var_dump(getFileByDate(__DIR__));
Cordialement

Re: Ouvrir le dernier fichier (le plus récent) d'un répertoire

par Ascla » 19 janv. 2016, 19:32

Je vais argumenter un peu plus mon message précédent.
La fonction filemtime() renvoie une date au format Timestamp Unix.
Pour comparer 2 dates de ce format, je te propose ceci :

Imaginons 2 date telles :
  • 19 Janvier 2016 18h25 & 32s
    14 Janvier 2015 13h32 & 22s
Comment comparer ces 2 dates ? La façon la plus simple pour moi serait de les transformer comme ceci :
Annee/Mois/Jour/Heure/Minute/Seconde
Ça donnerait donc :
  • 19 Janvier 2016 18h25 & 32s --> 2016.01.19.18.25.32
    14 Janvier 2015 13h32 & 22s--> 2015.01.14.13.32.22
Ainsi, 20160119182532 > 20150114133222

Donc plus notre date serait récente, plus elle serait importante.

Il faudrait donc transformer les dates que l'on obtient avec la fonction date()
http://php.net/manual/fr/function.date.php

Voici ce que ça pourrait donner en php avec l'exemple que je t'avais donné plus haut. Je n'ai pas testé !
if ($handle = opendir('.')) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            if ($tampon){
                if ( date("YmdHis", filemtime($file)) > date("YmdHis", filemtime($tampon)) ) {
                    $tampon = $file;
                }
            }
            else
            {
                $tampon = $file;
            }
        }
    }
    closedir($handle);
    echo $tampon;
}

Re: Ouvrir le dernier fichier (le plus récent) d'un répertoire

par Ascla » 19 janv. 2016, 19:15

Voila ce que ca donne

Code : Tout sélectionner

if($handle = opendir($path)) { while (false !== ($file = readdir($handle))) { if ($file{0} != '.') { $list[] = date (filemtime()) . "Le chemin du fichier le plus recent est: " . $path . '/' . $file; } } rsort($list); $new_file = $list[0]; echo $new_file;
Et ca fonctionne !! Merci !!
Ton code ne semble pas correct. Tu stockes tous les fichiers dans un tableau et tu ne ressors que la première valeur ajoutée.
Il te manque la variable tampon qui va comparer les fichiers entre eux du style, si le nouveau fichier trouvé a une date plus récente que l'ancien, alors on stocke ce fichier dans notre mémoire tampon.

Re: Ouvrir le dernier fichier (le plus récent) d'un répertoire

par rmathieu » 19 janv. 2016, 19:09

Maintenant, j'aimerai ouvrir le fichier du resultat, en gras: "Et le chemin du fichier le plus recent est: /var/www/html/parse/test_log/20160119-052703-2061_user.log"

Il contient une liste comme celle ci (xml):
<include url="testerman:///path/du/fichier/à/parser1.log" timestamp="1453178690.45" c
lass="core"></include>
<include url="testerman:///path/du/fichier/à/parser2.log" timestamp="1453178690.45" c
lass="core"></include>

Il faudrait que j’enlève les '///' et stocker dans une variable "path/du/fichier/à/parser1.log" et "path/du/fichier/à/parser2.log"

J’espère que j'ai été clair dans mes explications.

Merci de votre aide :)

Re: Ouvrir le dernier fichier (le plus récent) d'un répertoire

par rmathieu » 19 janv. 2016, 19:02

Voila ce que ca donne

Code : Tout sélectionner

if($handle = opendir($path)) { while (false !== ($file = readdir($handle))) { if ($file{0} != '.') { $list[] = date (filemtime()) . "Le chemin du fichier le plus recent est: " . $path . '/' . $file; } } rsort($list); $new_file = $list[0]; echo $new_file;
Et ca fonctionne !! Merci !!

Re: Ouvrir le dernier fichier (le plus récent) d'un répertoire

par rmathieu » 19 janv. 2016, 18:24

Non mon script se situe à la racine de ma machine et après je dois aller ouvrir /home/user/dossier_à_ouvrir/ et dans le dossier à ouvrir je vais devoir ouvrir le fichier le plus récent du dossier.

Pour ensuite faire du parcing... Peut etre que tu pourras m'aider pour mes autres soucis ....

Re: Ouvrir le dernier fichier (le plus récent) d'un répertoire

par Ascla » 19 janv. 2016, 18:21

Oui, le opendir() permet de récupérer un pointeur sur un dossier.
http://php.net/manual/fr/function.opendir.php
Si le fichier php est dans le même dossier, tu peux laisser '.' qui signifie qu'on effectue la recherche dans le répertoire actuel.
Si tu aurais mis opendir(/tmp/php), ceci aurait signifié qu'on aurait cherché les fichiers dans le fichier php qui est lui-meme dans le fichier tmp qui est lui-même à la racine.

Re: Ouvrir le dernier fichier (le plus récent) d'un répertoire

par rmathieu » 19 janv. 2016, 18:17

Merci pour ces explications, et à la place des "." et ".." si j'ai bien compris je met le path de mon directory ?

Re: Ouvrir le dernier fichier (le plus récent) d'un répertoire

par Ascla » 19 janv. 2016, 18:14

Eh bien la première étape consisterait à lister tous les fichiers/dossiers avec scandir par exemple :
http://php.net/manual/fr/function.scandir.php
Scandir te renvoie directement un tableau avec tous les fichiers/dossiers. Je te laisse lire la doc
Cependant, je pense que readdir sera plus simple à utiliser puisqu'il te propose directement un code (dans la documentation) qui te permet de lister les fichiers.
http://php.net/manual/fr/function.readdir.php
<?php
if ($handle = opendir('.')) {
    while (false !== ($entry = readdir($handle))) {
        if ($entry != "." && $entry != "..") {
            echo "$entry\n";
        }
    }
    closedir($handle);
}
?>
Il suffit donc ensuite d'utiliser filemtime pour récupérer la date de modification de chaque fichier et de garder celui qui sera le plus récent.