Pergunta

Eu tenho arquivos com espaços em seus nomes que já estão no meu servidor. Quero renomeá-los com sublinhados. Eu tentei colocar uma barra antes do espaço, e eu tentei substituir o espaço com% 20. Ainda PHP me dá:

Não existe tal arquivo ou diretório.

Aqui está o meu código:

$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++]);
}
Foi útil?

Solução

Tem certeza que o tal erro de arquivo não acontece se você não tentar a renomeação? Um bom primeiro passo quando a depuração é simplificar o problema até que ele não é mais buggy.

Eu não posso dizer se você fez isso porque ele não foi trabalhar no primeiro ou não, mas você definitivamente não deve estar usando rawurlencode() em um nome de arquivo local, que está garantido para as coisas estragar. Além disso, estou curioso o que está fazendo com "(Dir) {$fname}" - que parece ser também um bug. Eu suspeito mais provável que você quer fazer é:

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

Você também deve perceber, no entanto, que o que retorna dir é o nome do arquivo em relação ao diretório passou , então você precisa se certificar de suas operações is_dir() e renomeie levar isso em conta. Assim, mais do que provável que você quer dizer:

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

e

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

Outras dicas

Adicionar a:

print "$file\n";

antes da declaração de mudança de nome para ver o que você está recebendo.

Além disso, você deve adicionar um strstr ($ fname, ' ') para o seu if antes de adicionar o arquivo para a matriz para que operam apenas em nomes de arquivos que contêm um espaço:

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

I usado para gerar um hack rápido para limpar alguns arquivos realmente mal nomeados. Aqui está o meu código; usá-lo se quiser.

<?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";
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top