Использование PHP для переименования файлов с пробелами - PullRequest
1 голос
/ 04 августа 2009

У меня есть файлы с пробелами в их именах, которые уже есть на моем сервере. Я хочу переименовать их с подчеркиванием. Я попытался поставить косую черту перед пробелом и попытался заменить пробел на% 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++]);
}

Ответы [ 3 ]

2 голосов
/ 04 августа 2009

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

Я не могу сказать, сделали ли вы это, потому что сначала он не работал или нет, но вам определенно не следует использовать 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++]);
1 голос
/ 19 февраля 2012

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

<?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";
    }
1 голос
/ 04 августа 2009

Добавить:

print "$file\n";

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

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

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