8768 sujets

Développement web côté serveur, CMS

Bonsoir,

Je cherche à déplacer des images (avions-001, avions-002... et montagne-2009-001, montagne-2009-002...) contenues dans un dossier "images".

Vers des sous dossiers ("avions" et "montagne") contenus dans "images", qui devront être créés s'ils n'existent pas.

Le code marche très bien car les images sont déplacées vers les sous dossiers correspondants lorsque je fais un refresh de la page.

Or, si je fais un 2e refresh de la page, le message d'erreur suivant apparaît et je n'arrive pas à trouver d'où vient le problème:

( ! ) Warning: rename(C:/wamp64/www/devoir1_3/images/avions,C:/wamp64/www/devoir1_3/images/avions/avions): Le processus ne peut pas accéder au fichier car ce fichier est utilisé par un autre processus. (code: 32) in C:\wamp64\www\devoir1_3\class\Image.php on line 22


( ! ) Warning: rename(C:/wamp64/www/devoir1_3/images/montagne,C:/wamp64/www/devoir1_3/images/montagne/montagne): Le processus ne peut pas accéder au fichier car ce fichier est utilisé par un autre processus. (code: 32) in C:\wamp64\www\devoir1_3\class\Image.php on line 22

Voici le code en question.

index.php
<?php
require('config.php');
require('class/Image.php');
require('contenu.php');
?>


contenu.php
<?php

$image = new Image();
$images = $image->getImages(IMAGE_DIR_PATH);
?>

<?php foreach ($images as $image) : ?>
<li><a href="<?php echo IMAGE_DIR_URL . $image ?>"><?php echo $image ?></a></li>
<?php endforeach ?>


config.php
<?php
define('WEB_DIR_NAME', 'devoir1_3');
define('IMAGE_DIR_NAME', 'images');
define('IMAGE_DIR_PATH', $_SERVER['DOCUMENT_ROOT'] .'/'. WEB_DIR_NAME .'/'. IMAGE_DIR_NAME .'/');
define('IMAGE_DIR_URL', 'http://' .$_SERVER['HTTP_HOST'] .'/'. WEB_DIR_NAME .'/'. IMAGE_DIR_NAME .'/');
?>


Image.php
<?php
class Image
{
    public function getImages($image_dir)
    {
        if ($handle = opendir($image_dir))
        {
            while (false !== ($entry = readdir($handle)))
            {
                if ($entry != '.' && $entry != '..')
                {
                    $images[] = $entry;
                    $explode_filename = explode('-', $entry);
                     
                    if (!is_dir(IMAGE_DIR_PATH . $explode_filename[0]))
                    {  
                        var_dump(IMAGE_DIR_PATH . $explode_filename[0]);
                        mkdir(IMAGE_DIR_PATH . $explode_filename[0]);
                    }
                    $oldname = IMAGE_DIR_PATH .$entry;
                    $newname = IMAGE_DIR_PATH .$explode_filename[0]. '/' .$entry;
                    rename($oldname, $newname);
                }
            }
        }
        closedir($handle);
        return $images;
    }
}
?>


D'avance merci
Modifié par Gan3sh (11 Mar 2019 - 19:17)
A chaque fois que tu actualises ta page, ton code va générer de plus en plus de dossiers imbriqués /avions/avions/avions/etc...

Ta ligne :
$newname = IMAGE_DIR_PATH .$explode_filename[0]. '/' .$entry;


1er passage sur la page :
$newname = 'C:/wamp64/www/devoir1_3/images/avions/avions-001';


Actualisation de la page :
le problème est là, tu essaies de déplacer le dossier 'avions' que tu es en train de lire dans le dossier 'avions/avions'
car readdir te renvoie les dossiers et les fichiers
$newname = 'C:/wamp64/www/devoir1_3/images/avions/avions';
Salut yiujia,

Merci pour ta réponse rapide, si je comprends bien ce que tu me dis.
Chaque actualisation de la page lance donc un nouveau tour de boucle, ce qui est logique, créant ainsi un sous dossier dans le précédent (sauf que celui-ci n'est pas créé car il est lu et ne peut être déplacé).

Du coup comment remédier à cela de manière à ce que l'erreur soit supprimée, mon but étant d'avoir un seul sous dossier par catégorie ?