【问题标题】:Archive::Any gives IO errorArchive::Any 给出 IO 错误
【发布时间】:2013-03-12 11:57:57
【问题描述】:
#!/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 错误:复制期间写入错误:文件描述符错误
 在 C:/Perl/site/lib/Archive/Any.pm 第 193 行。
IO 错误:复制期间写入错误:文件描述符错误
 在 C:/Perl/site/lib/Archive/Any.pm 第 193 行。
IO 错误:复制期间写入错误:文件描述符错误
 在 C:/Perl/site/lib/Archive/Any.pm 第 193 行。
IO 错误:复制期间写入错误:文件描述符错误
 在 C:/Perl/site/lib/Archive/Any.pm 第 193 行。

【问题讨论】:

  • 在 CPAN 模块中没有使用 Carp 可能是我对 perl 生态系统最大的不喜欢。
  • 关于 perl 生态系统的真实情况
  • 错误实际上是在Archive::Zip::Member at line 1068中指定的。事实上,Carp 用于错误,但调用堆栈跟踪会有所帮助......快乐正在进行的错误搜索......
  • 您可以使用Carp::Always 强制堆栈跟踪。
  • 我在 Windows 和 Linux 上都试过你的代码,解压文件没有问题。您确定 zip 文件没有损坏并且任何 zip 文件都会出现此错误?

标签: windows perl cygwin cpan


【解决方案1】:

我使用以下代码对其进行了测试。使用两个已知良好的 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\colorbox-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 文件没有损坏。

【讨论】:

    猜你喜欢
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 2014-10-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    相关资源
    最近更新 更多