2

我的服务器上已经有名称中带有空格的文件。我想用下划线重命名它们。我尝试在空格前加一个斜杠,并尝试用 %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++]);
}
4

3 回答 3

2

如果您不尝试重命名,您确定不会发生 no such file 错误吗?调试的第一步是简化问题,直到不再出现问题。

我不知道你是否这样做,因为它一开始没有工作,但你绝对不应该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++]);
于 2009-08-04T01:09:06.247 回答
1

添加一个:

print "$file\n";

在重命名声明之前,看看你得到了什么。

此外,在将文件添加到数组之前,您应该在 if 语句中添加 strstr($fname, ' '),这样您就只能对包含空格的文件名进行操作:

if ( ($fname != '.') && ($fname != '..') && !is_dir("./$fname" ) && strstr($fname, ' ')) 
{
  $old_files[] = $fname;
}
于 2009-08-04T01:12:23.517 回答
1

我曾经生成一个快速 hack 来清理一些非常糟糕的命名文件。这是我的代码;如果需要,请使用它。

<?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";
    }
于 2012-02-19T17:13:58.910 回答