2013-03-22 51 views
2
#!/usr/bin/perl 
use strict; 
use warnings; 

my $archive_files = "C:\\Temp\\FREMOTE\\test.zip"; 
sub extract_archive($$); 

extract_archive($archive_files, "C:\\Temp\\FREMOTE\\TEST\\"); 
extract_archive("C:\\Temp\\FREMOTE\\TEST\\testb.zip", 
       "C:\\Temp\\FREMOTE\\TEST\\testb\\"); 

sub extract_archive($$) { 
    my $archive_file = shift; 
    my $extract_dir = shift; 
    if (! -d "$extract_dir") { 
     mkdir $extract_dir; 
    } 
    use Archive::Any; 
    my $archive = Archive::Any->new($archive_file); 
    if($archive->extract($extract_dir)) { 
     print "Extracted $archive_file into $extract_dir\n"; 
     undef $archive; 
    } else { 
     print "Failed to extracted $archive_file into $extract_dir\n"; 
    } 
} 

我得到以下錯誤。我如何解決它?存檔::任何給出IO錯誤

IO error: write error during copy : Bad file descriptor 
at C:/Perl/site/lib/Archive/Any.pm line 193. 
IO error: write error during copy : Bad file descriptor 
at C:/Perl/site/lib/Archive/Any.pm line 193. 
IO error: write error during copy : Bad file descriptor 
at C:/Perl/site/lib/Archive/Any.pm line 193. 
IO error: write error during copy : Bad file descriptor 
at C:/Perl/site/lib/Archive/Any.pm line 193.
+1

在CPAN模塊中缺少鯉魚可能是我最不喜歡的perl生態系統。 – jordanm 2013-03-22 15:15:14

+0

關於perl生態系統的真實性 – joe 2013-03-22 15:19:39

+2

該錯誤實際上是在['Archive :: Zip :: Member'1068行](https://metacpan.org/source/Archive::Zip::Member#L1068)中指定的。事實上,鯉魚是用於錯誤,但一個調用堆棧跟蹤會有幫助...快樂的正在進行的錯誤狩獵... – amon 2013-03-22 17:10:41

回答

0

我用下面的代碼測試了它。使用兩個已知好的zip文件,我將第二個zip文件添加到第一個文件中 - 重現我相信你正在做的事情。與原來的代碼我不停的第二文件的提取期間接收一個錯誤:

Extracted C:\Temp\colorbox-master.zip into C:\Temp\FREMOTE\TEST\<br> 
Can't call method "extract" on an undefined value at Perl-1.pl line 19. 

從你的錯誤不同,但固定用下面的代碼:

#!/usr/bin/perl 
use strict; 
use warnings; 

my $archive_files = "C:\\Temp\\colorbox-master.zip"; 

extract_archive($archive_files, "C:\\Temp\\FREMOTE\\TEST\\"); 
extract_archive("C:\\Temp\\FREMOTE\\TEST\\easybox-v1.3.zip", "C:\\Temp\\FREMOTE\\TEST\\testb\\"); 

sub extract_archive { 
    my $archive_file = shift; 
    my $extract_dir = shift; 
    if (!-d "$extract_dir") { 
     mkdir $extract_dir; 
    } 
    use Archive::Any; 
    my $archive = Archive::Any->new($archive_file); 
    if($archive->extract($extract_dir)) { 
     print "Extracted $archive_file into $extract_dir\n"; 
     undef $archive; 
    } else { 
     print "Failed to extracted $archive_file into $extract_dir\n"; 
    } 
} 

提取C:\ TEMP \顏色框-master.zip到C:\ TEMP \ FREMOTE \ TEST \
提取C:\ TEMP \ FREMOTE \ TEST \ easybox-v1.3.zip到C:\ TEMP \ FREMOTE \ TEST \ TESTB \

注我剛剛安裝了'Archive :: Any-0.0932'模塊(ActiveState Perl)我可能有不同的(固定)版本。你可能想檢查你的模塊是否是最新版本。並且你的zip文件沒有被破壞。