Использование PHP для переименования файлов с пробелами

У меня есть файлы с пробелами в именах, которые уже есть на моем сервере. Я хочу переименовать их с подчеркиванием. Я пробовал поставить косую черту перед пробелом и пробовал заменить пробел на %20. Тем не менее PHP дает мне:

Данный файл или каталог отсутствует.

Вот мой код:

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

person Corey    schedule 04.08.2009    source источник


Ответы (3)


Вы уверены, что такой ошибки файла не произойдет, если вы не попытаетесь переименовать? Хорошим первым шагом при отладке является упрощение проблемы до тех пор, пока она не перестанет содержать ошибки.

Я не могу сказать, сделали ли вы это, потому что сначала это не работало или нет, но вам определенно не следует использовать rawurlencode() для локального имени файла, это гарантированно все испортит. Кроме того, мне любопытно, что вы делаете с "(Dir) {$fname}" - это тоже ошибка. Я подозреваю, что, скорее всего, вы хотите сделать следующее:

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

Однако вы также должны понимать, что dir возвращает имя файла относительно переданного каталога, поэтому вам нужно убедиться, что ваши is_dir() и операции переименования учитывают это. Так что, скорее всего, вы хотите сказать:

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

а также

rename($dir.'/'.$file,$dir.'/'.$new_files[$x++]);
person dimo414    schedule 04.08.2009
comment
Мне нужен был $dir.'/'. Спасибо! - person Corey; 04.08.2009

Добавить:

print "$file\n";

перед оператором переименования, чтобы увидеть, что вы получаете.

Кроме того, вы должны добавить strstr($fname, ' ') в свой оператор if перед добавлением файла в массив, чтобы вы работали только с именами файлов, содержащими пробел:

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

Я использовал быстрый хак для очистки некоторых файлов с очень плохими именами. Вот мой код; используйте его, если хотите.

<?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";
    }
person GregC    schedule 19.02.2012