我试图读取我刚刚创建的文件(a.txt)的内容。这个文件包含一个由" ABCDE"组成的字符串,然后我用write()函数tar。我可以看到" a.tar"在我的目录中创建,但是当我进入read()函数时,我收到一个错误:无法读取a.tar:在testtar.pl第14行。
我做错了吗?是因为我在Windows上吗?
use strict;
use warnings;
use Archive::Tar;
# $Archive::Tar::DO_NOT_USE_PREFIX = 1;
my $tari = Archive::Tar->new();
$tari->add_files("a.txt");
$tari->write("a.tar");
my $file = "a.tar";
my $tar = Archive::Tar->new() or die "Can't create a tar object : $!";
if(my $error = $tar->read($file)) {
die "Can't read $file : $!";
}
my @files = $tar->get_files();
for my $file_obj(@files) {
my $fh = $file_obj->get_content();
binmode($fh);
my $fileName = $file_obj->full_path();
my $date = $file_obj->mtime();
print $fh;
}
感谢。
答案 0 :(得分:3)
您误解了Archive::Tar
的read
的返回值:
$tar->read ( $filename|$handle, [$compressed, {opt => 'val'}] )
返回标量上下文中读取的文件数,以及列表上下文中的
Archive::Tar::File
个对象列表。
请更改以下
if(my $error = $tar->read($file)) {
die "Can't read $file : $!";
}
到
unless ($tar->read($file)) {
die "Can't read $file : $!";
}
再试一次。
答案 1 :(得分:1)
这是错误的:
my $fh = $file_obj->get_content();
binmode($fh);
get_content()为您提供文件的内容,而不是文件句柄。 binmode()期待文件句柄。此外,您可以使用!defined 而不是,除非(我认为它更容易阅读)。
重写如下:
#!/bin/env perl
use strict;
use warnings;
use Archive::Tar;
my $tari = Archive::Tar->new();
$tari->add_files("a.txt");
$tari->add_files("b.txt");
$tari->add_files("c.txt");
$tari->add_files("d.txt");
$tari->write("a.tar");
my $file = "a.tar";
my $tar = Archive::Tar->new() or die "Can't create a tar object : $!";
if(!defined($tar->read($file)))
{
die "Can't read $file : $!";
}
my @files = $tar->get_files();
for my $file_obj(@files)
{
my $fileContents = $file_obj->get_content();
my $fileName = $file_obj->full_path();
my $date = $file_obj->mtime();
print "Filename: $fileName Datestamp: $date\n";
print "File contents: $fileContents";
print "-------------------\n";
}