Pregunta

Tengo archivos con espacios en sus nombres que ya están en mi servidor. Quiero cambiarles el nombre con guiones bajos. Intenté poner una barra diagonal antes del espacio, e intenté reemplazar el espacio con% 20. Todavía PHP me da:

  

No existe tal archivo o directorio.

Aquí está mi código:

$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++]);
}
¿Fue útil?

Solución

¿Está seguro de que el error de archivo no se produce si no intenta cambiar el nombre? Un buen primer paso al depurar es simplificar el problema hasta que ya no tenga errores.

No puedo decir si hiciste esto porque al principio no funcionaba o no, pero definitivamente no deberías usar rawurlencode () en un nombre de archivo local, eso garantiza que arruinará las cosas arriba. Además, tengo curiosidad por saber qué está haciendo con " (Dir) {$ fname} " , que también parece ser un error. Sospecho que lo más probable es que quieras hacer:

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

También debe tener en cuenta, sin embargo, que lo que dir devuelve es el nombre de archivo relativo al directorio pasado , por lo que debe asegurarse de que su is_dir () y las operaciones de cambio de nombre lo tienen en cuenta. Entonces, más que probable que quieras decir:

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

y

rename($dir.'/'.$file,$dir.'/'.$new_files[$x++]);

Otros consejos

Añadir un:

print "$file\n";

antes de la declaración de cambio de nombre para ver lo que obtienes.

Además, debe agregar un strstr ($ fname, '') a su instrucción if antes de agregar el archivo a la matriz para que solo opere en nombres de archivo que contengan un espacio:

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

Solía ??generar un truco rápido para limpiar algunos archivos mal nombrados. Aquí está mi código; úsalo si quieres.

<?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";
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top