2009-08-04 13 views
1

J'ai des fichiers avec des espaces dans leurs noms qui sont déjà sur mon serveur. Je veux les renommer avec des underscores. J'ai essayé de mettre un slash avant l'espace, et j'ai essayé de remplacer l'espace avec% 20. Encore PHP me donne:Utiliser PHP pour renommer des fichiers avec des espaces

Aucun fichier ou répertoire.

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++]); 
} 

Répondre

2

Êtes-vous sûr que le pas de l'erreur de fichier ne se produit pas si vous ne tentez pas le changement de nom? Une bonne première étape lors du débogage est de simplifier le problème jusqu'à ce qu'il ne soit plus buggé.

Je ne peux pas dire si vous avez fait cela parce que ça ne fonctionnait pas au début ou pas, mais vous ne devriez certainement pas utiliser rawurlencode() sur un nom de fichier local, c'est sûr de gâcher les choses. De plus, je suis curieux de savoir ce que vous faites avec "(Dir) {$fname}" - cela semble être aussi un bug. Je soupçonne que plus probablement ce que vous voulez faire est:

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

Vous devez aussi réaliser, cependant, que ce dir rendement est le nom du fichier par rapport au répertoire passé de sorte que vous devez vous assurer que votre is_dir() et renommer des opérations prenez cela en compte. Donc, plus que probable que vous voulez dire:

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

et

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

J'avais besoin du $ dir. '/'. Merci! – Corey

0

Ajouter un:

print "$file\n"; 

avant la déclaration de changement de nom pour voir ce que vous obtenez.

En outre, vous devez ajouter un strstr (FNAME $, ' «) à votre instruction if avant d'ajouter le fichier au tableau afin que vous utilisez uniquement sur les fichiers contenant un espace:

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

je pour générer un hack rapide pour nettoyer certains 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"; 
    } 
Questions connexes