[RESOLU] [POO] Le processus ne peut pas accéder au fichier

Petit nouveau ! | 2 Messages

18 mars 2019, 19:58

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;
    }
}
?>

L'erreur apparaît au 2e refresh, donc au 2e tour de boucle qui normalement ne devrait pas avoir lieu car au 1er le dossier et créé s'il n'existe pas et les images y sont déplacées dans ceux-ci.

D'avance merci

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 8026 Messages

18 mars 2019, 20:24

C'est parce que tu essayes de faire un rename() sur les dossiers que tu viens de créer.
Pour éviter cela tu pourrais vérifier que le fichier que tu traite est bien un fichier et non pas un dossier.

http://php.net/manual/fr/function.is-dir.php
Quand tout le reste a échoué, lisez le mode d'emploi...

Petit nouveau ! | 2 Messages

19 mars 2019, 04:49

Salut @rtur

Merci pour ta réponse rapide, grâce à toi j'ai pu trouver la réponse.

$oldname = IMAGE_DIR_PATH .$entry;
$newname = IMAGE_DIR_PATH .$explode_filename[0]. '/' .$entry;
rename($oldname, $newname);

Est devenu:
$oldname = IMAGE_DIR_PATH .$entry;
$newname = IMAGE_DIR_PATH .$explode_filename[0]. '/' .$entry;
if (is_file($oldname)) 
{
	rename($oldname, $newname);
}

Et cela marche nickel, un grand merci.