2013-04-14 35 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

相關問題