Question

J'ai des fichiers avec des espaces dans leurs noms qui se trouvent déjà sur mon serveur. Je veux les renommer avec des traits de soulignement. J'ai essayé de mettre une barre oblique avant l'espace, et j'ai remplacé l'espace par% 20. PHP me donne toujours:

  

Aucun fichier ou répertoire de ce type.

Voici mon code:

$dir = './';
$dhandle = opendir($dir);
$old_files = array();

if ($dhandle) {
    while (false !== ($fname = readdir($dhandle)))
    {
        if ( ($fname != '.') && ($fname != '..') )
        {
            $old_files[] = (is_dir( "./$fname" )) ? "(Dir) {$fname}" : $fname;
        }
    }
    closedir($dhandle);
}

$new_files = str_replace(' ', '_', $old_files);
$x = 0;
foreach($old_files as $file)
{
    rename(rawurlencode($file), $new_files[$x++]);
}
Était-ce utile?

La solution

Êtes-vous sûr que cette erreur de fichier ne se produit pas si vous ne tentez pas de le renommer? Une bonne première étape lors du débogage consiste à simplifier le problème jusqu'à ce que le problème ne soit plus résolu.

Je ne peux pas dire si vous l'avez fait parce que cela ne fonctionnait pas au début ou non, mais vous ne devriez absolument pas utiliser rawurlencode () sur un nom de fichier local, vous êtes assuré de tout gâcher. up. De plus, je suis curieux de savoir ce que vous faites avec " (Dir) {$ fname} & <; code> - cela semble aussi être un bogue. Je suppose que plus probablement ce que vous voulez faire est:

if ( ($fname != '.') && ($fname != '..') && !is_dir("./$fname" )) 
{
  $old_files[] = $fname;
}

Vous devez également vous rendre compte, cependant, que ce que dir renvoie est le nom de fichier relatif au répertoire passé . Vous devez donc vous assurer que votre is_dir () et renommer les opérations en tiennent compte. Donc, plus que probablement, vous voulez dire:

is_dir($dir.'/'.$fname);

et

rename($dir.'/'.$file,$dir.'/'.$new_files[$x++]);

Autres conseils

Ajouter un:

print "$file\n";

avant l'instruction de renommer pour voir ce que vous obtenez.

De plus, vous devez ajouter une chaîne strstr ($ fname, '') à votre instruction if avant d'ajouter le fichier au tableau afin que vous n'utilisiez que les noms de fichiers contenant un espace:

if ( ($fname != '.') && ($fname != '..') && !is_dir("./$fname" ) && strstr($fname, ' ')) 
{
  $old_files[] = $fname;
}

J'avais l'habitude de générer un piratage rapide pour nettoyer des fichiers vraiment mal nommés. Voici mon code; utilisez-le si vous voulez.

<?php
    $dir = './';
    $dhandle = opendir($dir);
    $old_files = array();

    if ($dhandle) {
    while (false !== ($fname = readdir($dhandle))) {
        if ( ($fname != '.') && ($fname != '..') && !is_dir("./$fname" ))
             $old_files[] = $fname;
       }
       closedir($dhandle);
    }

    foreach($old_files as $file)
    {
        $new_name = str_replace(',', '', str_replace('&', '', str_replace(' ','',$file)));
        rename("./".$file, "./".$new_name);
        echo $new_name."\n";
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top