开发者

How to handle filenames with spaces?

I use Perl on windows(Active Perl). I have a perl program to glob the files in current folder, and concatenate them all using dos copy command called from within using system()...

When i execute, this gives a dos error saying "The system cannot find the file specified." It's related to the spaces in the filenames I have.

This is the perl code :-

@files = glob "*.mp3";
$outfile = 'final.mp3';
$firsttime = 1;
foreach (@files)
{

    if($firsttime == 1)
    {
       @args = ('copy' ,"/b ","$_","+","$outfile", "$outfile");
       system (@args);
       #system("copy /b '$_'+$outfile $outfile"); 
       $firsttime = 0;  
    }
    else
    {
       @args = ('copy' ,"/b ","$outfile","+","$_", "$outfile");
       system (@args);
       #system("copy /b $outfile+'$_' $outfile"); 
    }

}

glob returns a array of filenames in my current folder, Those file names have spaces in between them, so the array elements h开发者_JS百科ave spaces in between. When i use the system(...) to execute my copy command on those array elements using "$_" as shown above, it gives error as above.

I tried couple of ways in which I could call the system(...) but without any success.

I would like to know,

1] How can i get this working on files which have spaces in between them using the code above. How to 'escape' the white space in file names.

2] Any alternative solution in Perl to achieve the same thing. (Simple ones welcome..)


Stop using system() to make a call that can be done with a portable library. Perl has a the File::Copy module, use that instead and you don't have to worry about things like this plus you get much better OS portability.


Your code doesn't add any quotes around the filenames.

Try

"\"$_\""

and

"\"$outfile\""


system is rarely the right answer, use File::Copy;

To concatenate all files:

use File::Copy;
my @in = glob "*.mp3";
my $out = "final.mp3";

open my $outh, ">", $out;
for my $file (@in) {
    next if $file eq $out;
    copy($file, $outh);
}
close $outh;


Issues may arise when you're trying to access the variable $_ inside an inner block. The safest way, change:

foreach (@files)

to:

foreach $file (@files)

Then do the necessary changes on @args, and escape doublequotes to include them in the string..

@args = ('copy' ,"/b ","\"$file\"","+","$outfile", "$outfile");
...
@args = ('copy' ,"/b ","$outfile","+","\"$file\"", "$outfile");


In windows you can normally put double quotes around the filenames (and/or paths) allowing special chars i.e "long file names".

C:\"my long path\this is a file.mp3"

Edit:

Does this not work?

system("copy /b \"$_\"+$outfile $outfile");

(NOTE THE DOUBLE quotes within the string not single quotes)


$filename =~ s/\ /\ /;

what ever the filename is just use slash to refrence spaces


The built in "rename" command also moves files:

    rename $source, $destination;   # ...and move

I use this on windows all the time.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜