2009-08-04 3 views
1

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

ответ

2

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

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

Мне понадобился $ dir. '/'. Благодаря! – Corey

0

Добавить:

print "$file\n"; 

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

Кроме того, вы должны добавить strstr ($ Fname, ' «) для вашего если заявление перед добавлением файла в массив, чтобы вы работать только на именах файлов, содержащих пробел:

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

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

<?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"; 
    } 
Смежные вопросы