2013-04-14 37 views
-6

请检查下面的代码:文件复制到另一个,但代码是不工作

#!/usr/bin/perl -w 
use Cwd;   
use warnings;  
use Net::FTP;  
use File::Copy;  
use File::Path;  
use Time::Local;  
use File::Basename;  
use strict;  
my $directory = "/media/Songs/Perl/test";  
my $path = "/media/Songs/Perl/test_sort";  
opendir(DIR,$directory);  
my @files = readdir(DIR);  
closedir(DIR);  
foreach my $t (@files) 
{  
    copy($t,$path); //copying files 
} 
+4

“请检查代码”不是问题,它是一个请求。如果你想避免downvotes,找出你的代码中的问题,包括错误信息,解释程序如何不按你想要的方式工作。 – TLP

回答

7

这是我对你的代码进行修订。

#!/usr/bin/env perl 

use strict; 
use warnings; 
use File::Copy; 

my $source_dir = "/media/Songs/Perl/test"; 
my $target_dir = "/media/Songs/Perl/test_sort"; 

opendir(my $DIR, $source_dir) || die "can't opendir $source_dir: $!"; 
my @files = readdir($DIR); 

foreach my $t (@files) 
{ 
    if(-f "$source_dir/$t") { 
     #Check with -f only for files (no directories) 
     copy "$source_dir/$t", "$target_dir/$t"; 
    } 
} 

closedir($DIR); 
+0

thnx Miguel Prz ....它的工作现在.. – InvI

+1

提供没有解释答案有什么好处? – TLP

+1

这是不言而喻的,不是吗? –

3

readdir函数需要一些后处理才有用。它返回该目录中的所有条目,包括.(此目录)和..父目录。返回的字符串不是您的$ PWD的完整路径。

  1. 过滤掉不需要的物品:正则表达式匹配父和自我链接

    my @files = grep !/\A\.\.?\z/, readdir DIR; 
    

    或只能选择简单的-f尔斯(没有目录,也没有乐趣像管道,插座...)

    my @files = grep -f "$directory/$_", readdir DIR; 
    
  2. 制作绝对路径:

    真的,应该使用Path::ClassFile::Spec。但如果你小心,并且不在意便携性,那么

    for my $file (@files) { 
        my $source = "$directory/$file"; 
        ...; 
    } 
    

    可能是够好的了。

copy函数有两个文件名,而不是文件和目标目录。您应该执行错误检查:

for my $file (@files) { 
    my $source = "$directory/$file"; 
    my $target = "$path/$file"; 
    copy $source => $target or warn "Copy of $file failed: $!"; 
} 
+1

否。从File :: Copy'复制'子程序不需要两个文件名。如果第二个参数是目录,它将使用原始文件名。 +1的解释,但。 – TLP

相关问题