comparer le contenu de2 répertoires / afficher la différence

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 : comparer le contenu de2 répertoires / afficher la différence

par mankind » 18 juin 2005, 12:52

et bah volontiers :lol:

par Cyrano » 18 juin 2005, 12:41

[Résolu] alors :?: :)

par mankind » 18 juin 2005, 12:39

ahhhh les amis, on y est arrivé :lol: :lol:
merci Cyrano et Naholyr !!!

alors bon effectivement Naholyr, un bon coup de plumeau était nécessaire.
je vais relire pour la n-ième fois les tutos sur les tableaux.
faudra que ça rentre un jour.

cyrano ton dernier code renvoyait Warning: Wrong parameter count for array_push() ... on line 15
mais c'est vrai qu'il manquait le chemin vers small - et oui pas la peine d'ouvrir small - indiquer le chemin suffisait.
pour ce qui est du contrôle de l'extension, en l'espèce j'en ai pas besoin...

donc voici le code final (enfin j'espère - en tout cas il fonctionne parfaitement).
// liste les fichiers du répertoire albums et stocke dans le tableau Array
$Array = array();
$dir = opendir("./albums/");
while ($File = readdir($dir)) {
if($File != "." && $File != ".." && $File != "index.htm" && $File != "thumb2.php") {
$Array[] = "$File";
}
}
closedir($dir);
sort($Array);
$nb = count($Array);
for($i = 0; $i < $nb; $i++) {
$img = $Array[$i];
// si le fichier n'existe pas dans small j'affiche le fichier contenu dans albums
if(!file_exists("./small/".$img)) {
echo "<a href=albums/thumb2.php?fichier=$img>$img</a><br>";
}
}
bon j'espère que ce petit code sera utile à d'autres.

merci encore cyrano et naholyr.

par Cyrano » 18 juin 2005, 11:54

Proposition de correction : j'ai un peu modifié la recherche en utilisant une expression régulière: on cherche des images, donc je cherche des images .jpg, .jpeg, .gif ou .png, donc même si tu as du .doc ou du .pdf, ça ne sera pas enregistré.
<?php
// liste les fichiers du répertoire albums et stocke dans le tableau Array
$liste = array();
$dir = opendir("./albums/");
while ($File = readdir($dir))
{
    if($File != "." && $File != ".." && preg_match("#\b(\w)*\.(jpg|jpeg|gif|png)\b#i", $File))
    {
        array_push($liste);
    }
}
closedir($dir);

/* Recherche de NON correspondance dans le répertoire des miniatures */

/* On compte les éléments du tableau */
$nb = count($liste);

for($i = 0; $i < $nb; $i++)
{
    // si le fichier n'existe pas dans small j'affiche le fichier contenu dans albums
    if(!file_exists("./small/".$liste[$i]))
    {
        echo "<a href=albums/thumb2.php?fichier=". $liste[$i] .">". $liste[$i] ."</a><br>";
    }
}
?>
dans la seconde partie, je crois bien qu'il manquait le chemin vers le répertoire des miniatures, et autre point important, tu cherchais $vignette au lieu de reprendre le nom ... enregistré dans la tableau, donc forcément, tu ne trouvais rien du tout.

Essaye avec ça et reviens avec les éventuels messages d'erreur. (S'il y en a) :)

par naholyr » 18 juin 2005, 11:40

Un petit coup de plumeau pour virer les trucs inutiles et indenter un peu ;)
// liste les fichiers du répertoire albums et stocke dans le tableau Array
$Array = array();
$dir = opendir("./albums/");
// $i=0; // inutile, on voit plus loin qu'on n'utilise pas $i dans la boucle
while ($File = readdir($dir)) {
    if($File != "." && $File != ".." && $File != "index.htm" && $File !=  "thumb2.php") {
        $Array[] = "$File";
    }
    // $i++; // inutile, quand utilises-tu $i dans ta boucle ?
}
closedir($dir);

// liste les fichiers du repertoire small
/*$dossier = opendir ("./small/");
while ($vignette = readdir ($dossier)) {
if ($vignette != "." && $vignette != "..") {
}
}
closedir ($dossier);
*/ // inutile, tu parcours un dossier mais ne fais rien, autant ne pas le parcourir :p


sort($Array);
$nb = count($Array);
for($i = 0; $i < $nb; $i++) {
// si le fichier n'existe pas dans small j'affiche le fichier contenu dans albums
    if(!file_exists($vignette[$i])) { // tu fais un test d'existence d'un fichier dans "small", mais tu vérifies ici dans le répertoire courant...
        echo "<a href=albums/thumb2.php?fichier=$Array[$i]>$Array[$i]</a><br>";
    }
}
Ce qui donne
// liste les fichiers du répertoire albums et stocke dans le tableau Array
$Array = array();
$dir = opendir("./albums/");
while ($File = readdir($dir)) {
    if($File != "." && $File != ".." && $File != "index.htm" && $File !=  "thumb2.php")
        $Array[] = "$File";
}
closedir($dir);

sort($Array);
$nb = count($Array);
for($i = 0; $i < $nb; $i++) {
    $img = $Array[$i];
    // si le fichier n'existe pas dans small j'affiche le fichier contenu dans albums
    if(!file_exists($vignette[$i]))
        echo "<a href=albums/thumb2.php?fichier=$img>$img</a><br>";
}
À mon avis, tu nous ferais un petit
print_r($vignettes);
print_r($Array);
juste avant la dernière boucle qu'on y verrait un peu plus clair...

par mankind » 18 juin 2005, 11:22

Tu te compliques inutilement la vie.
j'en conviens :roll:
c'est juste que j'arrivais pas à utiliser file_exists()
bon alors voilà ce que j'ai fait (merci de pas me lancer de tomates)...

// liste les fichiers du répertoire albums et stocke dans le tableau Array
$Array = array();
$dir = opendir("./albums/");
$i=0;
while ($File = readdir($dir)) {
if($File != "." && $File != ".." && $File != "index.htm" && $File != "thumb2.php") {
$Array[] = "$File";
}
$i++;
}
closedir($dir);

// liste les fichiers du repertoire small
$dossier = opendir ("./small/");
while ($vignette = readdir ($dossier)) {
if ($vignette != "." && $vignette != "..") {
}
}
closedir ($dossier);


sort($Array);
$nb = count($Array);
for($i = 0; $i < $nb; $i++) {
// si le fichier n'existe pas dans small j'affiche le fichier contenu dans albums
if(!file_exists($vignette[$i])) {
echo "<a href=albums/thumb2.php?fichier=$Array[$i]>$Array[$i]</a><br>";
}
}
ça n'a aucun effet et ça n'a rien cassé non plus. docteur est-ce que je dois poster dans le forum "le php pour les nuls" :arrow:

par Cyrano » 17 juin 2005, 23:38

Tu te compliques inutilement la vie. Voici le schéma que je suggère:
-1- tu liste les fichier du premier répertoire et tu récupères la liste dans un tableau;

-2- À partir de ce tableau, pour chaque fichier trouvé dans le premier, tu cherche sa miniature dans le second répertoire, dans une boucle for par exemple.

Dans la seconde partie, tu testes l'inexistence du fichier
// $fichier est un tableau contenant la liste de l'étape 1
$nb = count($fichiers);
for($i = 0; $i < $nb; $i++)
{
    if(!fileexists($fuchier[$i]))
    {
        // Ici tu fais le traitement que tu veux pour créer la vignette inexistante
    }
}
Tu ne teste pas l'existence, si la vignette est là, on passe, donc pas besoin d'un else: si le fichier existe, fin de du tour et on reboucle sur la suivante.

Saisis tu mieux l'idée que j'ai suggéré au départ ?

par mankind » 17 juin 2005, 21:38

oui effectivement je vois bien le problème.
mais du coup je patauge complètement.

par Cyrano » 17 juin 2005, 21:20

OK, pour que tu visualises mieux, je te ré-écris ta formule:
if(($File != ".") && ($File != "..") && ($File != "index.htm") && ($File != "thumb2.php") $elimine)
Il te reste une variable toute seule qui ne correspond à rien, saisis-tu le problème ?

par mankind » 17 juin 2005, 20:52

ah alors en fait...

j'indique (au moment de lister le dossier small) que:
$elimine = ' && File != "'.$fichier.'"';
si les images image1.JPG et image2.JPG sont présentes dans mon dossier small par exemple, alors $elimine est égal à :
&& File !=image1.JPG && File!=image2.JPG

et j'ai pensé que si jécrivais :
if($File != "." && $File != ".." && $File != "index.htm" && $File != "thumb2.php" $elimine)
cela reviendrait à écrire :
if($File != "." && $File != ".." && $File != "index.htm" && $File != "thumb2.php" && File !=image1.JPG && File!=image2.JPG)
mais bon soit il n'est pas possible d'entrer une variable en conditionnel,
soit je n'ai pas trouvé la bonne syntaxe (j'ai essayé plusieurs syntaxes).

par Cyrano » 17 juin 2005, 19:52

J'essaye de comprendre ce que tu as voulu faire et je ne trouve pas: la dernière condition est en erreur parce que tu envoies une variable toute seule:
La dernière condition est :
$File != "thumb2.php" $elimine
Quel lien y a-t-il entre ""thumb2.php" et $elimine ?

par mankind » 17 juin 2005, 16:33

arhg je n'arrive pas du tout à utiliser file_exists() dans ce cas...

j'ai bricolé autre chose...
function DirTri($rep,$tri)
{
$Array = array(); 
$dir = opendir($rep);
$i=0;

// liste repertoire small
$dossier = opendir ("./small/");
while ($fichier = readdir ($dossier)) {
if ($fichier != "." && $fichier != "..") {
$elimine = ' && File != "'.$fichier.'"';
echo ''.$elimine.'';
}}
closedir ($dossier);
echo '<br>';
//

while ($File = readdir($dir))
{
if($File != "." && $File != ".." && $File != "index.htm" && $File != "thumb2.php")
{
$Array[] = "$File";
}
$i++;
}
closedir($dir);
if($tri == 'DESC'){
rsort($Array);
}else{
sort($Array);
}
$Max = count($Array);
for($i = 0; $i != $Max; $i++){
echo "<a href=albums/thumb2.php?fichier=$Array[$i]>$Array[$i]</a><br>";
}
echo "<br><br>".$Max." fichier(s)" ;
}
// param.1 : chemin du répertoire ("." si il s'agit du rép. courant)
// param.2 : ASC ou DESC (A-Z ou Z-A)
DirTri("./albums/","ASC");
j'ai ensuite voulu mettre la variable $elimine dans dans la conditionnelle - quelque chose du genre :
if($File != "." && $File != ".." && $File != "index.htm" && $File != "thumb2.php" $elimine)
mais il y une parse error, que je mette $elimine ou '.$elimine.' ou "$elimine" etc... n'est-il pas possible de mettre une variable dans la conditionnelle ?

par Cyrano » 17 juin 2005, 12:26

Liste les images du répertoire album et pour chaque fichier trouvé, utilise la fonction file_exists() en pointant vers le fichier des miniatures. Si la réponse est nulle, tu fais un appel vers ta fonction de génération de vignette (Si c'est ça que tu veux faire), sinon, tu passes au fichier suivant

comparer le contenu de2 répertoires / afficher la différence

par mankind » 17 juin 2005, 12:08

salut,

Lorsque je crée une vignette, celle-ci est enregistrée dans le dossier small, et prend le même nom que l'image orginale présente dans le dossier albums.

Je liste le contenu du répertoire small avec la fonction DirTris.
Je liste le contenu du répertoire albums avec la fonction DirTri.

J'aimerais que la fonction DirTri n'affiche que les images qui n'ont pas encore de vignettes.

Comment faire pour insérer dans la ligne de code :
if($File != "." && $File != ".." && $File != "index.htm" && $File != "thumb2.php" ) de DIrTri, les noms de fichiers contenus dans le répertoire small. Ce qui permettrait j'imagine de ne pas afficher les fichiers communs à albums et small. J'ai essayé différents trucs sans succès.

merci de votre aide
function DirTris($rep,$tri)
{
$Array = array(); 
$dir = opendir($rep);
$i=0;
while ($File = readdir($dir)){
if($File != "." && $File != ".." && $File != "index.htm" && $File != "thumb2.php")
{
$Array[] = "$File";
}
$i++;
}
closedir($dir);
if($tri == 'DESC'){
rsort($Array);
}else{
sort($Array);
}
$Max = count($Array);
for($i = 0; $i != $Max; $i++){
echo "$Array[$i]<br>";
}
echo "<br><br>".$Max." fichier(s)" ;
}
DirTris("./small/","ASC");


echo '<br><br>';


function DirTri($rep,$tri)
{
$Array = array(); 
$dir = opendir($rep);
$i=0;
while ($File = readdir($dir)){
if($File != "." && $File != ".." && $File != "index.htm" && $File != "thumb2.php" )
{
$Array[] = "$File";
}
$i++;
}
closedir($dir);
if($tri == 'DESC'){
rsort($Array);
}else{
sort($Array);
}
$Max = count($Array);
for($i = 0; $i != $Max; $i++){
echo "<a href=albums/thumb2.php?fichier=$Array[$i]>$Array[$i]</a><br>";
}
echo "<br><br>".$Max." fichier(s)" ;
}
DirTri("./albums/","ASC");