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

Eléphanteau du PHP | 13 Messages

19 janv. 2016, 16:58

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.

Eléphant du PHP | 243 Messages

19 janv. 2016, 17:56

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.
"Nos études ont montré que la probabilité qu’un programme corrigé fonctionne comme avant la correction est seulement de cinquante pour cent"
~~Lorenzo Strigini

Eléphanteau du PHP | 13 Messages

19 janv. 2016, 18:02

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 :).
Modifié en dernier par rmathieu le 19 janv. 2016, 18:14, modifié 2 fois.

Eléphant du PHP | 243 Messages

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.
"Nos études ont montré que la probabilité qu’un programme corrigé fonctionne comme avant la correction est seulement de cinquante pour cent"
~~Lorenzo Strigini

Eléphanteau du PHP | 13 Messages

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 ?

Eléphant du PHP | 243 Messages

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.
"Nos études ont montré que la probabilité qu’un programme corrigé fonctionne comme avant la correction est seulement de cinquante pour cent"
~~Lorenzo Strigini

Eléphanteau du PHP | 13 Messages

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

Eléphanteau du PHP | 13 Messages

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

Eléphanteau du PHP | 13 Messages

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 :)

Eléphant du PHP | 243 Messages

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.
"Nos études ont montré que la probabilité qu’un programme corrigé fonctionne comme avant la correction est seulement de cinquante pour cent"
~~Lorenzo Strigini

Eléphant du PHP | 243 Messages

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;
}
"Nos études ont montré que la probabilité qu’un programme corrigé fonctionne comme avant la correction est seulement de cinquante pour cent"
~~Lorenzo Strigini

Aureldunet
Invité n'ayant pas de compte PHPfrance

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

Mammouth du PHP | 1967 Messages

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é.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 13 Messages

20 janv. 2016, 10:29

Bonjour,

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

Eléphanteau du PHP | 13 Messages

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