Domanda

Ho dei file con spazi nei loro nomi che sono già sul mio server. Voglio rinominarli con caratteri di sottolineatura. Ho provato a mettere una barra prima dello spazio e ho provato a sostituire lo spazio con% 20. PHP mi dà ancora:

  

Nessun file o directory.

Ecco il mio codice:

$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++]);
}
È stato utile?

Soluzione

Sei sicuro che questo errore non si verifichi se non provi a rinominare? Un buon primo passo durante il debug è semplificare il problema fino a quando non è più difettoso.

Non so dire se l'hai fatto perché all'inizio non funzionava o meno, ma sicuramente non dovresti usare rawurlencode () su un nome di file locale, che è sicuro di rovinare le cose su. Inoltre, sono curioso di sapere cosa stai facendo con " (Dir) {$ fname} " - che sembra essere anche un bug. Sospetto che più probabilmente ciò che vuoi fare è:

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

Dovresti anche capire, tuttavia, che ciò che dir restituisce è il nome file relativo alla directory passata , quindi devi assicurarti che is_dir () e le operazioni di rinomina ne tengono conto. Quindi molto probabilmente vorrai dire:

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

e

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

Altri suggerimenti

Aggiungi a:

print "$file\n";

prima dell'istruzione rename per vedere cosa stai ricevendo.

Inoltre, è necessario aggiungere uno strstr ($ fname, '') all'istruzione if prima di aggiungere il file all'array in modo da operare solo su nomi di file contenenti uno spazio:

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

Generavo un trucco rapido per ripulire alcuni file con un nome davvero sbagliato. Ecco il mio codice; usalo se vuoi.

<?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";
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top