代码之家  ›  专栏  ›  技术社区  ›  Corey

使用PHP用空格重命名文件

  •  1
  • Corey  · 技术社区  · 15 年前

    我的服务器上已有文件名中包含空格。我想用下划线重命名它们。我试过在空格前加一个斜线,用%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 回复  |  直到 9 年前
        1
  •  2
  •   dimo414    9 年前

    如果不尝试重命名,是否确定不发生此类文件错误?调试时的一个好的第一步是将问题简化到不再有问题为止。

    我不知道你是不是这样做了,因为它一开始不起作用,但你绝对不应该使用 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++]);
    
        2
  •  1
  •   Robert Swisher    15 年前

    添加:

    print "$file\n";
    

    在rename语句之前查看您得到了什么。

    此外,在将文件添加到数组之前,还应向if语句添加strstr($fname“”),以便只对包含空格的文件名进行操作:

    if ( ($fname != '.') && ($fname != '..') && !is_dir("./$fname" ) && strstr($fname, ' ')) 
    {
      $old_files[] = $fname;
    }
    
        3
  •  1
  •   Peter Mortensen icecrime    9 年前

    我曾经生成一个快速的黑客程序来清理一些名字很差的文件。这是我的代码;如果你想的话就用它。

    <?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";
        }