Page 1 sur 1

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

Posté : 18 mars 2019, 19:58
par Gan3sh
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

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

Posté : 18 mars 2019, 20:24
par @rthur
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

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

Posté : 19 mars 2019, 04:49
par Gan3sh
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.