PHP comment lister les derniers fichiers modifiés parmi des sous-dossiers [Résolu]

Signaler
-
 Amorph -
Bonjour,

Après avoir découvert la PirateBox puis la LibraryBox, j'avais proposé d'aider à la réalisation d'un de ces boitiers de partage pour le CDI du lycée. Et le temps a passé...
Suite à l'arrêt du projet "LibraryBox" (de même que PirateBox d'ailleurs) et ayant enfin un TP-Link MR3020 mais version 3, soit la version non supportée par la dernière version du projet, je me suis retrouvé à bidouiller comme je pouvais pour essayer de faire avec.

Finalement, j'ai un MR3020 avec OpenWRT, un serveur PHP, une belle page d'accueil avec même une page d'exploration des fichiers (https://github.com/halgatewood/file-directory-list/ mais voilà :
j'aimerais ajouter dans un cadre de ma page d'accueil un bout de code PHP afin de récupérer mes "x" derniers fichiers modifiés en modifiant facilement le nombre "x" de fichiers affichés car ensuite le boitier risque d'être entre les mains de personnes s'y connaissant encore moins que moi !

Ces fichiers sont dans un dossier "Shared" disposant de sous-dossiers pour chaque type de fichier, Vidéos, Audio, Images, etc.

J'ai trouvé 2 bouts de code intéressants.
Le 1er m'affiche une petite arborescence de tous les sous-dossiers avec les noms des fichiers qu'ils contiennent :
<?php
error_reporting(E_ALL);
ini_set("display_errors", 0);
function getDirrecurse($path = 'Shared/', $level = 0)
{
    $ignore = array('.', '..');
    $dir = @opendir($path);
        while(false !== ($file = readdir($dir)))
        { 
            if(!in_array($file, $ignore))
            {     
                $spaces = str_repeat(' ', ($level*4));  
                if(is_dir("$path/$file"))
                { 
                    echo "<strong>$spaces $file</strong><br />"; 
                    getDirrecurse( "$path/$file", ($level+1));       
                } 
                else 
                { 
                    echo "$spaces $file<br />"; 
                }
            }
        }
    closedir($dir); 
}
getDirrecurse();   ?>


Le 2nd bout de code me donne ici les 3 derniers éléments modifiés, mais sans aller chercher dans les sous-dossiers, donc il me donne les 3 derniers sous-dossier modifiés au lieu de me donner les fichiers :
<?php
$dossier = 'Shared/';
$dir = opendir($dossier);
//nombre d'éléments à afficher :
$n = 3;
while ($object = readdir($dir))
   {
   if ($object != "." && $object != "..") {
   $filename = $dossier . $object;
   $file_object = array(
         'time' => filemtime($filename),
         'name' => $object,
         'size' => filesize($filename)
                                        );
                    $dir_objects[] = $file_object;
                }
   }
array_multisort($dir_objects, SORT_DESC);
array_splice($dir_objects,$n);
for($i=0;$i<count($dir_objects);$i++)
      {
      echo $dir_objects[$i]['name'].' ('.strftime("%d/%m/%Y à %T", $dir_objects[$i]['time']).')<br/> //affiche le nom de l'élément, sa date et heure de dernière modification
';
      } 
 ?>


Dans l'idéal, je souhaiterais avoir le premier code (pour sa mise en page) mais ne me donnant que les "x" derniers fichiers modifiés avec un href vers ces fichiers.
Au pire, je peux me contenter du second code à condition qu'il ne me donne pas les sous-dossiers mais les fichiers uniquement (donc en allant chercher récursivement les fichiers dans chaque sous-dossier) et de même avec un lien href.

J'ai essayé de comprendre comment on code en PHP pour aller fouiller dans divers sous-dossiers afin de faire la modification moi-même mais je m'embrouille, j'ai vu trop de bouts de code différents mais qui font ce même travail.

Je vous remercie d'avance pour votre aide !

2 réponses

Messages postés
12763
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
25 octobre 2020
712
ce serait beaucoup plus simple de montrer les fichiers ayant été modifié récemment, les "x" derniers jours ou heures.
pour faire comme tu demandes, j'adapterais le code #1, pour qu'il commence par rassembler les dates de tous les fichiers, ce qui permet de déterminer la date à partir de laquelle tu veux afficher chaque fichier.
et ensuite, n'afficher que les fichiers plus récents que cette date.
>
Messages postés
12763
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
25 octobre 2020

Oui ça me conviendrait merci.
Ce n'est pas l'idée que j'avais au départ mais ça reste bien dans l'idée de mettre à disposition d'un coup d’œil sur la page d'accueil des liens vers les "derniers" fichiers.

D'ailleurs si possible, j'aimerai que les liens puissent être affichés du plus récent au plus ancien, ce serait bien !
Messages postés
12763
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
25 octobre 2020
712 > Amorph
dans ton code 1, je suggère de remplacer la ligne 20 par:
$datemodif= filemtime("$path/$file");
$deltaj= (time()-$datemodif)/(3600*24);
if (deltaj<=10) {
	echo "$spaces $file. ' ('.strftime("%d/%m/%Y à %T", $datemodif) . ')<br/>";
}
>
Messages postés
12763
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
25 octobre 2020

J'ai un message Parse error: syntax error, unexpected '%' in ... mon fichier php et la ligne correspondant à ta ligne 4.
Si j'enlève
. ' ('.strftime("%d/%m/%Y à %T", $datemodif) . ')
pour ne laisser que le print du fichier alors ça fonctionne.
Messages postés
12763
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
25 octobre 2020
712 > Amorph
sans doute
echo $spaces . $file . ' (' . strftime("%d/%m/%Y à %T", $datemodif) . ')<br/>';
>
Messages postés
12763
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
25 octobre 2020

Après quelques modifications et grâce à ta proposition, ça fonctionne et j'en arrive à :
<?php

error_reporting(E_ALL);
ini_set("display_errors", 0);
setLocale(LC_TIME, 'fr_FR.utf8','fra');

function getDirrecurse($path = 'Shared/', $level = 0)
{
$ignore = array('explorateur.php', '.', '..');
$dir = @opendir($path);
while(false !== ($file = readdir($dir)))
{
if(!in_array($file, $ignore))
{
$spaces = str_repeat(' ', ($level*4));
if(is_dir("$path/$file"))
{
$datemodif= filemtime("$path/$file");
$deltaj= (time()-$datemodif)/(3600*24);
if ($deltaj<=14) //Nombre max de jours d'ancienneté des fichiers
{
$nom_acc=utf8_encode($file);
echo "<br/><strong>$spaces $nom_acc :</strong><br />";
getDirrecurse( "$path/$file", ($level+1));
}
}
else
{
$dateajout= filectime("$path/$file");
$deltaj= (time()-$dateajout)/(3600*24);
if ($deltaj<=14) //Nombre max de jours d'ancienneté des fichiers
{
$nom_acc=utf8_encode($file);
echo "$spaces ● <a href=\"$path/$file \">$nom_acc</a>"
. ' (' . strftime("Le %d/%m/%Y à %H:%M", $dateajout) . ')<br/>';
//echo "$spaces <a href=\"$path/$file \">$file</a><br/>";
//echo "$spaces $spaces" . ' (' . strftime("Le %d/%m/%Y à %H:%M", $dateajout) . ')<br/>';
}
}
}
}
closedir($dir);
}

getDirrecurse();
?>


Merci yg_be !
Messages postés
12763
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
25 octobre 2020
712
bonjour,
tu ne décris pas précisément ce que tu souhaites comme résultat, ni quelle aide tu demandes.
Bonjour,
Désolé si je ne suis pas clair.

Dans l'idéal je souhaiterai que le code m'affiche par exemple :
Vidéo
Exemple de vidéo.mp4 20/07/2020 à 12h34
Audio
Exemple de musique.mp3 17/07/2020 à 10h24
Exemple de podcast.mp3 15/07/2020 à 15h40

Or mon code n°1 m'affiche tous les fichiers et pas juste les derniers.
Et mon code n°2 m'afficherait :
Vidéo 20/07/2020 à 12h34
Audio 17/07/2020 à 10h24

Sachant que "Vidéo" et "Audio" son des noms de sous-dossiers contenus dans un dossier principal "Shared".

Donc je souhaiterais obtenir le même genre d'affichage que mon code n°1 mais avec les noms des fichiers en href pointant vers par exemple les 3 ou 5 ou 10 derniers fichiers au lieu de m'afficher tout comme il le fait actuellement.
Ainsi un élève souhaitant aller voir la nouvelle vidéo ajoutée n'a pas besoin d'aller sur la page de l'explorateur pour y accéder.

L'aide que je demande est :
- soit comment je peux modifier mon code n°1 pour qu'il ne me donne que les "x" derniers fichiers modifiés
- soit comment faire pour que mon code n°2 ne me donnent pas mes derniers sous-dossiers modifiés mais ne prennent que des fichiers et qu'il aille les chercher dans mes différents sous-dossiers

J'espère que j'ai été plus complet dans ma demande...
Merci.