2

I've got files with spaces in their names that are already on my server. I want to rename them with underscores. I've tried putting a slash before the space, and I've tried replacing the space with %20. Still PHP gives me:

No such file or directory.

Here's my 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++]);
}

3 Answers 3

2

Are you sure the no such file error does not happen if you don't attempt the rename? A good first step when debugging is to simplify the problem until it's no longer buggy.

I can't tell if you did this because it wasn't working at first or not, but you definitely should not be using rawurlencode() on a local filename, that's guaranteed to screw things up. Additionally, I'm curious what you're doing with "(Dir) {$fname}" - that seems to also be a bug. I suspect more likely what you want to do is:

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

You should also realize, however, that what dir returns is the filename relative to the directory passed so you need to make sure your is_dir() and rename operations take that into account. So more than likely you want to say:

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

and

rename($dir.'/'.$file,$dir.'/'.$new_files[$x++]);
Sign up to request clarification or add additional context in comments.

1 Comment

I needed the $dir.'/'. THanks!
1

Add a:

print "$file\n";

before the rename statement to see what you're getting.

Also, you should add a strstr($fname, ' ') to your if statement before adding the file to the array so you only operate on filenames containing a space:

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

Comments

1

I used to generate a quick hack to clean up some really badly named files. Here's my code; use it if you want.

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.