2013-03-22 2 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"; 
    } 
} 

다음과 같은 오류가 발생했습니다. 어떻게 해결합니까?Archive :: Any는 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 모듈에서 잉어 사용 부족은 아마도 펄 생태계에 대한 가장 큰 싫어할 것입니다. – jordanm

+0

실제 펄 환경에 관한 진실 – joe

+2

오류는 실제로 ['Archive :: Zip :: Member' 라인 1068] (https://metacpan.org/source/Archive::Zip::Member#L1068)에 명시되어 있습니다. 실제로, Carp는 오류에 사용되지만 호출 스택 추적은 도움이 될 것입니다 ... 계속 진행중인 버그 추적 ... – amon

답변

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 : \ 임시 \의 colorbox C로 -master.zip : \ 임시 \ FREMOTE의 \ 테스트 \
추출 C : \ 임시 \ FREMOTE의 \의 TEST C로 \ easybox-v1.3.zip : \ 임시 \ FREMOTE의 \ 테스트 \를 TestB \

참고 내가 'Archive :: Any-0.0932'모듈 (ActiveState Perl)을 설치했기 때문에 다른 (고정 된) 버전이있을 수 있습니다. 모듈이 최신 버전인지 확인하고 싶을 수 있습니다. 그리고 귀하의 zip 파일이 깨진되지 않습니다.