Page 1 sur 2

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

Posté : 19 janv. 2016, 16:58
par rmathieu
Bonjour,

J'aimerai savoir comment je pourrait ouvrir le dernier fichier (le plus récent) d'un répertoire pour ensuite le parser en PHP bien sur ?

Merci à vous.

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

Posté : 19 janv. 2016, 17:56
par Ascla
Bonjour,

Il existe la fonction filemtime qui renvoie la date de la dernière modification d'un fichier.
http://php.net/manual/fr/function.filemtime.php

Il suffit juste de parcourir à l'aide d'une boucle tous les fichiers et de ne garder que le plus récent.

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

Posté : 19 janv. 2016, 18:02
par rmathieu
Merci de ta réponse.

Mais je ne vois pas quels éléments je dois insérer dans ma boucle. Il est possible d'avoir d'avantage d'explications ?

Merci à toi :).

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

Posté : 19 janv. 2016, 18:14
par Ascla
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.

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

Posté : 19 janv. 2016, 18:17
par rmathieu
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

Posté : 19 janv. 2016, 18:21
par Ascla
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

Posté : 19 janv. 2016, 18:24
par rmathieu
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

Posté : 19 janv. 2016, 19:02
par rmathieu
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

Posté : 19 janv. 2016, 19:09
par rmathieu
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

Posté : 19 janv. 2016, 19:15
par Ascla
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

Posté : 19 janv. 2016, 19:32
par Ascla
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

Posté : 20 janv. 2016, 00:01
par Aureldunet
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

Posté : 20 janv. 2016, 09:40
par Spols
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

Posté : 20 janv. 2016, 10:29
par rmathieu
Bonjour,

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

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

Posté : 20 janv. 2016, 10:32
par rmathieu
Quand je test ton code, il me renvoie le fichier le plus vieux et non pas le plus récent..