PHP comment lister les derniers fichiers modifiés parmi des sous-dossiers

Résolu/Fermé
Amorph - Modifié le 20 juil. 2020 à 09:39
 Amorph - 21 juil. 2020 à 12:09
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 !
A voir également:

2 réponses

yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
20 juil. 2020 à 14:02
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.
1
OK je vois l'idée.
J'ai peut-être oublié de préciser que je ne suis pas du tout programmeur, et que je comprend seulement en gros ce que font les bouts de code que j'ai cités, du genre les assignations de variables, les conditions...

Du coup :
1- quelles modifications dois-je faire pour effectivement récupérer et mettre de côté la date de modification des fichiers ? Je suppose avec filemtime() mais sans savoir comment le rédiger.
2- comment faire le filtre avec une date
3- comment mettre à jour la date de tri ? Je suppose avec time() mais comment enlever "x" jours ?
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471 > Amorph
20 juil. 2020 à 18:38
cela te conviendrait-il de montrer les fichiers ayant été modifié récemment, les "x" derniers jours ou heures?
au lieu de montrer un nombre déterminé de fichiers?
0
Amorph > yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024
20 juil. 2020 à 18:57
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 !
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471 > Amorph
20 juil. 2020 à 19:44
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/>";
}
0
Amorph > yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024
20 juil. 2020 à 21:46
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.
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
20 juil. 2020 à 12:18
bonjour,
tu ne décris pas précisément ce que tu souhaites comme résultat, ni quelle aide tu demandes.
0
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.
0