Frage

Ich habe in ihren Namen Dateien mit Leerzeichen bekommt, die bereits sind auf meinem Server. Ich möchte, dass sie mit Unterstrichen umbenennen. Ich habe versucht, einen Schrägstrich vor dem Platz setzen, und ich habe versucht, 20, um den Raum mit% zu ersetzen. PHP gibt mir noch:

  

Keine solche Datei oder ein Verzeichnis.

Hier ist mein Code:

$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++]);
}
War es hilfreich?

Lösung

Sind Sie sicher, dass das keine solche Datei Fehler nicht passieren, wenn Sie die Umbenennungs nicht versuchen? Ein guter erster Schritt beim Debuggen, um das Problem zu vereinfachen, bis es nicht mehr Buggy ist.

Ich kann nicht sagen, wenn Sie dies getan, weil es nicht auf den ersten Arbeiten wurde oder nicht, aber Sie sollten auf jeden Fall nicht rawurlencode() auf einem lokalen Dateinamen verwenden, ist, dass garantiert Dinge vermasseln. Außerdem bin ich gespannt, was Sie mit "(Dir) {$fname}" tun - das auch scheint ein Fehler zu sein. Ich vermute eher, was Sie tun möchten, ist:

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

Sie sollten auch erkennen jedoch, dass dir zurückkehrt, was der Dateiname relativ zu dem Verzeichnis übergeben , so müssen Sie Ihre is_dir() stellen Sie sicher, und umbenennen Operationen das berücksichtigen. Also mehr als wahrscheinlich wollen Sie sagen:

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

und

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

Andere Tipps

Fügen Sie ein:

print "$file\n";

vor der Umbenennungs Anweisung, um zu sehen, was Sie bekommen.

Außerdem sollten Sie eine strstr ($ fname, ' ‚), um Ihre if-Anweisung hinzufügen, bevor Sie die Datei auf dem Array hinzugefügt, so dass Sie nur auf Dateinamen betreiben ein Leerzeichen enthalten:

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

Ich habe einen schnellen Hack zu erzeugen einige wirklich schlecht benannten Dateien zu bereinigen. Hier ist mein Code; verwenden Sie es, wenn Sie wollen.

<?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";
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top